home *** CD-ROM | disk | FTP | other *** search
/ Windows Game Programming for Dummies (2nd Edition) / WinGamProgFD.iso / mac / DirectX SDK / DXSDK / include / ks.h < prev    next >
C/C++ Source or Header  |  2001-10-08  |  316KB  |  11,338 lines

  1. /*++
  2.  
  3. Copyright (c) Microsoft Corporation. All rights reserved.
  4.  
  5. Module Name:
  6.  
  7.     ks.h
  8.  
  9. Abstract:
  10.  
  11.     Windows Driver Model/Connection and Streaming Architecture (WDM-CSA)
  12.     core definitions.
  13.  
  14. --*/
  15.  
  16. #if !defined(_KS_)
  17. #define _KS_
  18.  
  19. #if defined(__TCS__)
  20. #define _KS_NO_ANONYMOUS_STRUCTURES_ 1
  21. #endif
  22.  
  23.  
  24. /////////////////////////////////////////////////////////////////////////////
  25. //
  26. //  Windows XP vs. DirectX 8.0 header merge
  27. //
  28. //  Separate the updated Windows XP version of this header from the downlevel
  29. //  version that shipped with the DirectX 8.0 SDK.  Since development 
  30. //  on BDA technology continued for Windows XP, some changes were made to
  31. //  this file in order to improve the interface and functionality.
  32. //
  33. //  To maintain compatibility with older applications which rely on the
  34. //  DirectX 8.0 versions of these files, the DirectX 8.1 version includes
  35. //  both the Windows XP content and the DirectX 8.0 content, which are 
  36. //  separated by the #if (WINVER >= 0x501) preprocessor directive.
  37. //
  38. //  Therefore, if you define WINVER to be 0x501 to specify Windows XP,
  39. //  the revised content will be compiled.  Otherwise, the original 
  40. //  DirectX 8.0 content will be used.
  41. //
  42. /////////////////////////////////////////////////////////////////////////////
  43.  
  44. #if (WINVER >= 0x501)    // Windows XP content
  45.  
  46.  
  47. #if !defined(_NTRTL_)
  48.     #ifndef DEFINE_GUIDEX
  49.         #define DEFINE_GUIDEX(name) EXTERN_C const CDECL GUID name
  50.     #endif // !defined(DEFINE_GUIDEX)
  51.  
  52.     #ifndef STATICGUIDOF
  53.         #define STATICGUIDOF(guid) STATIC_##guid
  54.     #endif // !defined(STATICGUIDOF)
  55. #endif // !defined(_NTRTL_)
  56.  
  57. #ifndef SIZEOF_ARRAY
  58.     #define SIZEOF_ARRAY(ar)        (sizeof(ar)/sizeof((ar)[0]))
  59. #endif // !defined(SIZEOF_ARRAY)
  60.  
  61. #if defined(__cplusplus) && _MSC_VER >= 1100
  62. #define DEFINE_GUIDSTRUCT(g, n) struct __declspec(uuid(g)) n
  63. #define DEFINE_GUIDNAMED(n) __uuidof(struct n)
  64. #else // !defined(__cplusplus)
  65. #define DEFINE_GUIDSTRUCT(g, n) DEFINE_GUIDEX(n)
  66. #define DEFINE_GUIDNAMED(n) n
  67. #endif // !defined(__cplusplus)
  68.  
  69. //===========================================================================
  70.  
  71. #define STATIC_GUID_NULL \
  72.     0x00000000L, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  73.  
  74. DEFINE_GUIDSTRUCT("00000000-0000-0000-0000-000000000000", GUID_NULL);
  75. #define GUID_NULL DEFINE_GUIDNAMED(GUID_NULL)
  76.  
  77. //===========================================================================
  78.  
  79. #define IOCTL_KS_PROPERTY              CTL_CODE(FILE_DEVICE_KS, 0x000, METHOD_NEITHER, FILE_ANY_ACCESS)
  80. #define IOCTL_KS_ENABLE_EVENT          CTL_CODE(FILE_DEVICE_KS, 0x001, METHOD_NEITHER, FILE_ANY_ACCESS)
  81. #define IOCTL_KS_DISABLE_EVENT         CTL_CODE(FILE_DEVICE_KS, 0x002, METHOD_NEITHER, FILE_ANY_ACCESS)
  82. #define IOCTL_KS_METHOD                CTL_CODE(FILE_DEVICE_KS, 0x003, METHOD_NEITHER, FILE_ANY_ACCESS)
  83. #define IOCTL_KS_WRITE_STREAM          CTL_CODE(FILE_DEVICE_KS, 0x004, METHOD_NEITHER, FILE_WRITE_ACCESS)
  84. #define IOCTL_KS_READ_STREAM           CTL_CODE(FILE_DEVICE_KS, 0x005, METHOD_NEITHER, FILE_READ_ACCESS)
  85. #define IOCTL_KS_RESET_STATE           CTL_CODE(FILE_DEVICE_KS, 0x006, METHOD_NEITHER, FILE_ANY_ACCESS)
  86.  
  87. //===========================================================================
  88.  
  89. typedef enum {
  90.     KSRESET_BEGIN,
  91.     KSRESET_END
  92. } KSRESET;
  93.  
  94. typedef enum {
  95.     KSSTATE_STOP,
  96.     KSSTATE_ACQUIRE,
  97.     KSSTATE_PAUSE,
  98.     KSSTATE_RUN
  99. } KSSTATE, *PKSSTATE;
  100.  
  101. #define KSPRIORITY_LOW        0x00000001
  102. #define KSPRIORITY_NORMAL     0x40000000
  103. #define KSPRIORITY_HIGH       0x80000000
  104. #define KSPRIORITY_EXCLUSIVE  0xFFFFFFFF
  105.  
  106. typedef struct {
  107.     ULONG   PriorityClass;
  108.     ULONG   PrioritySubClass;
  109. } KSPRIORITY, *PKSPRIORITY;
  110.  
  111. typedef struct {
  112.     union {
  113. #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ )
  114.         struct _IDENTIFIER {
  115. #else        
  116.         struct {
  117. #endif        
  118.             GUID    Set;
  119.             ULONG   Id;
  120.             ULONG   Flags;
  121.         };
  122.         LONGLONG    Alignment;
  123.     };
  124. } KSIDENTIFIER, *PKSIDENTIFIER;
  125.  
  126. typedef KSIDENTIFIER KSPROPERTY, *PKSPROPERTY, KSMETHOD, *PKSMETHOD, KSEVENT, *PKSEVENT;
  127.  
  128. #define KSMETHOD_TYPE_NONE                  0x00000000
  129. #define KSMETHOD_TYPE_READ                  0x00000001
  130. #define KSMETHOD_TYPE_WRITE                 0x00000002
  131. #define KSMETHOD_TYPE_MODIFY                0x00000003
  132. #define KSMETHOD_TYPE_SOURCE                0x00000004
  133.  
  134. #define KSMETHOD_TYPE_SEND                  0x00000001
  135. #define KSMETHOD_TYPE_SETSUPPORT            0x00000100
  136. #define KSMETHOD_TYPE_BASICSUPPORT          0x00000200
  137.  
  138. #define KSMETHOD_TYPE_TOPOLOGY 0x10000000
  139.  
  140. #define KSPROPERTY_TYPE_GET                 0x00000001
  141. #define KSPROPERTY_TYPE_SET                 0x00000002
  142. #define KSPROPERTY_TYPE_SETSUPPORT          0x00000100
  143. #define KSPROPERTY_TYPE_BASICSUPPORT        0x00000200
  144. #define KSPROPERTY_TYPE_RELATIONS           0x00000400
  145. #define KSPROPERTY_TYPE_SERIALIZESET        0x00000800
  146. #define KSPROPERTY_TYPE_UNSERIALIZESET      0x00001000
  147. #define KSPROPERTY_TYPE_SERIALIZERAW        0x00002000
  148. #define KSPROPERTY_TYPE_UNSERIALIZERAW      0x00004000
  149. #define KSPROPERTY_TYPE_SERIALIZESIZE       0x00008000
  150. #define KSPROPERTY_TYPE_DEFAULTVALUES       0x00010000
  151.  
  152. #define KSPROPERTY_TYPE_TOPOLOGY 0x10000000
  153.  
  154. typedef struct {
  155.     KSPROPERTY      Property;
  156.     ULONG           NodeId;
  157.     ULONG           Reserved;
  158. } KSP_NODE, *PKSP_NODE;
  159.  
  160. typedef struct {
  161.     KSMETHOD        Method;
  162.     ULONG           NodeId;
  163.     ULONG           Reserved;
  164. } KSM_NODE, *PKSM_NODE;
  165.  
  166. typedef struct {
  167.     KSEVENT         Event;
  168.     ULONG           NodeId;
  169.     ULONG           Reserved;
  170. } KSE_NODE, *PKSE_NODE;
  171.  
  172. #define STATIC_KSPROPTYPESETID_General \
  173.     0x97E99BA0L, 0xBDEA, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  174. DEFINE_GUIDSTRUCT("97E99BA0-BDEA-11CF-A5D6-28DB04C10000", KSPROPTYPESETID_General);
  175. #define KSPROPTYPESETID_General DEFINE_GUIDNAMED(KSPROPTYPESETID_General)
  176.  
  177. #if defined(_NTDDK_) && !defined(__wtypes_h__)
  178. enum VARENUM {
  179.     VT_EMPTY = 0,
  180.     VT_NULL = 1,
  181.     VT_I2 = 2,
  182.     VT_I4 = 3,
  183.     VT_R4 = 4,
  184.     VT_R8 = 5,
  185.     VT_CY = 6,
  186.     VT_DATE = 7,
  187.     VT_BSTR = 8,
  188.     VT_DISPATCH = 9,
  189.     VT_ERROR = 10,
  190.     VT_BOOL = 11,
  191.     VT_VARIANT = 12,
  192.     VT_UNKNOWN = 13,
  193.     VT_DECIMAL = 14,
  194.     VT_I1 = 16,
  195.     VT_UI1 = 17,
  196.     VT_UI2 = 18,
  197.     VT_UI4 = 19,
  198.     VT_I8 = 20,
  199.     VT_UI8 = 21,
  200.     VT_INT = 22,
  201.     VT_UINT = 23,
  202.     VT_VOID = 24,
  203.     VT_HRESULT  = 25,
  204.     VT_PTR = 26,
  205.     VT_SAFEARRAY = 27,
  206.     VT_CARRAY = 28,
  207.     VT_USERDEFINED = 29,
  208.     VT_LPSTR = 30,
  209.     VT_LPWSTR = 31,
  210.     VT_FILETIME = 64,
  211.     VT_BLOB = 65,
  212.     VT_STREAM = 66,
  213.     VT_STORAGE = 67,
  214.     VT_STREAMED_OBJECT = 68,
  215.     VT_STORED_OBJECT = 69,
  216.     VT_BLOB_OBJECT = 70,
  217.     VT_CF = 71,
  218.     VT_CLSID = 72,
  219.     VT_VECTOR = 0x1000,
  220.     VT_ARRAY = 0x2000,
  221.     VT_BYREF = 0x4000,
  222.     VT_RESERVED = 0x8000,
  223.     VT_ILLEGAL = 0xffff,
  224.     VT_ILLEGALMASKED = 0xfff,
  225.     VT_TYPEMASK = 0xfff
  226. };
  227. #endif // _NTDDK_ && !__wtypes_h__
  228.  
  229. typedef struct {
  230.     ULONG    Size;
  231.     ULONG    Count;
  232. } KSMULTIPLE_ITEM, *PKSMULTIPLE_ITEM;
  233.  
  234. typedef struct {
  235.     ULONG           AccessFlags;
  236.     ULONG           DescriptionSize;
  237.     KSIDENTIFIER    PropTypeSet;
  238.     ULONG           MembersListCount;
  239.     ULONG           Reserved;
  240. } KSPROPERTY_DESCRIPTION, *PKSPROPERTY_DESCRIPTION;
  241.  
  242. #define KSPROPERTY_MEMBER_RANGES            0x00000001
  243. #define KSPROPERTY_MEMBER_STEPPEDRANGES     0x00000002
  244. #define KSPROPERTY_MEMBER_VALUES            0x00000003
  245.  
  246. #define KSPROPERTY_MEMBER_FLAG_DEFAULT                      0x00000001
  247. #define KSPROPERTY_MEMBER_FLAG_BASICSUPPORT_MULTICHANNEL    0x00000002
  248. #define KSPROPERTY_MEMBER_FLAG_BASICSUPPORT_UNIFORM         0x00000004
  249.  
  250. typedef struct {
  251.     ULONG   MembersFlags;
  252.     ULONG   MembersSize;
  253.     ULONG   MembersCount;
  254.     ULONG   Flags;
  255. } KSPROPERTY_MEMBERSHEADER, *PKSPROPERTY_MEMBERSHEADER;
  256.  
  257. typedef union {
  258. #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ )
  259.     struct _SIGNED {
  260. #else
  261.     struct {
  262. #endif    
  263.         LONG    SignedMinimum;
  264.         LONG    SignedMaximum;
  265.     };
  266. #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ )
  267.     struct _UNSIGNED {
  268. #else
  269.     struct {
  270. #endif    
  271.         ULONG   UnsignedMinimum;
  272.         ULONG   UnsignedMaximum;
  273.     };
  274. } KSPROPERTY_BOUNDS_LONG, *PKSPROPERTY_BOUNDS_LONG;
  275.  
  276. typedef union {
  277. #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ )
  278.     struct _SIGNED64 {
  279. #else
  280.     struct {
  281. #endif    
  282.         LONGLONG    SignedMinimum;
  283.         LONGLONG    SignedMaximum;
  284.     };
  285. #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ )
  286.     struct _UNSIGNED64 {
  287. #else
  288.     struct {
  289. #endif    
  290. #if defined(_NTDDK_)
  291.         ULONGLONG   UnsignedMinimum;
  292.         ULONGLONG   UnsignedMaximum;
  293. #else // !_NTDDK_
  294.         DWORDLONG   UnsignedMinimum;
  295.         DWORDLONG   UnsignedMaximum;
  296. #endif // !_NTDDK_
  297.     };
  298. } KSPROPERTY_BOUNDS_LONGLONG, *PKSPROPERTY_BOUNDS_LONGLONG;
  299.  
  300. typedef struct {
  301.     ULONG                       SteppingDelta;
  302.     ULONG                       Reserved;
  303.     KSPROPERTY_BOUNDS_LONG      Bounds;
  304. } KSPROPERTY_STEPPING_LONG, *PKSPROPERTY_STEPPING_LONG;
  305.  
  306. typedef struct {
  307. #if defined(_NTDDK_)
  308.     ULONGLONG                   SteppingDelta;
  309. #else // !_NTDDK_
  310.     DWORDLONG                   SteppingDelta;
  311. #endif // !_NTDDK_
  312.     KSPROPERTY_BOUNDS_LONGLONG  Bounds;
  313. } KSPROPERTY_STEPPING_LONGLONG, *PKSPROPERTY_STEPPING_LONGLONG;
  314.  
  315. //===========================================================================
  316.  
  317. #if defined(_NTDDK_)
  318. //
  319. // Structure forward declarations.
  320. //
  321. typedef struct _KSDEVICE_DESCRIPTOR
  322. KSDEVICE_DESCRIPTOR, *PKSDEVICE_DESCRIPTOR;
  323. typedef struct _KSDEVICE_DISPATCH
  324. KSDEVICE_DISPATCH, *PKSDEVICE_DISPATCH;
  325. typedef struct _KSDEVICE 
  326. KSDEVICE, *PKSDEVICE;
  327. typedef struct _KSFILTERFACTORY 
  328. KSFILTERFACTORY, *PKSFILTERFACTORY;
  329. typedef struct _KSFILTER_DESCRIPTOR
  330. KSFILTER_DESCRIPTOR, *PKSFILTER_DESCRIPTOR;
  331. typedef struct _KSFILTER_DISPATCH
  332. KSFILTER_DISPATCH, *PKSFILTER_DISPATCH;
  333. typedef struct _KSFILTER 
  334. KSFILTER, *PKSFILTER;
  335. typedef struct _KSPIN_DESCRIPTOR_EX
  336. KSPIN_DESCRIPTOR_EX, *PKSPIN_DESCRIPTOR_EX;
  337. typedef struct _KSPIN_DISPATCH
  338. KSPIN_DISPATCH, *PKSPIN_DISPATCH;
  339. typedef struct _KSCLOCK_DISPATCH
  340. KSCLOCK_DISPATCH, *PKSCLOCK_DISPATCH;
  341. typedef struct _KSALLOCATOR_DISPATCH
  342. KSALLOCATOR_DISPATCH, *PKSALLOCATOR_DISPATCH;
  343. typedef struct _KSPIN 
  344. KSPIN, *PKSPIN;
  345. typedef struct _KSNODE_DESCRIPTOR
  346. KSNODE_DESCRIPTOR, *PKSNODE_DESCRIPTOR;
  347. typedef struct _KSSTREAM_POINTER_OFFSET
  348. KSSTREAM_POINTER_OFFSET, *PKSSTREAM_POINTER_OFFSET;
  349. typedef struct _KSSTREAM_POINTER
  350. KSSTREAM_POINTER, *PKSSTREAM_POINTER;
  351. typedef struct _KSMAPPING
  352. KSMAPPING, *PKSMAPPING;
  353. typedef struct _KSPROCESSPIN
  354. KSPROCESSPIN, *PKSPROCESSPIN;
  355. typedef struct _KSPROCESSPIN_INDEXENTRY
  356. KSPROCESSPIN_INDEXENTRY, *PKSPROCESSPIN_INDEXENTRY;
  357. #endif // _NTDDK_
  358.  
  359. typedef PVOID PKSWORKER;
  360.  
  361. typedef struct {
  362.     ULONG       NotificationType;
  363.     union {
  364.         struct {
  365.             HANDLE              Event;
  366.             ULONG_PTR           Reserved[2];
  367.         } EventHandle;
  368.         struct {
  369.             HANDLE              Semaphore;
  370.             ULONG               Reserved;
  371.             LONG                Adjustment;
  372.         } SemaphoreHandle;
  373. #if defined(_NTDDK_)
  374.         struct {
  375.             PVOID               Event;
  376.             KPRIORITY           Increment;
  377.             ULONG_PTR           Reserved;
  378.         } EventObject;
  379.         struct {
  380.             PVOID               Semaphore;
  381.             KPRIORITY           Increment;
  382.             LONG                Adjustment;
  383.         } SemaphoreObject;
  384.         struct {
  385.             PKDPC               Dpc;
  386.             ULONG               ReferenceCount;
  387.             ULONG_PTR           Reserved;
  388.         } Dpc;
  389.         struct {
  390.             PWORK_QUEUE_ITEM    WorkQueueItem;
  391.             WORK_QUEUE_TYPE     WorkQueueType;
  392.             ULONG_PTR           Reserved;
  393.         } WorkItem;
  394.         struct {
  395.             PWORK_QUEUE_ITEM    WorkQueueItem;
  396.             PKSWORKER           KsWorkerObject;
  397.             ULONG_PTR           Reserved;
  398.         } KsWorkItem;
  399. // @@BEGIN_DDKSPLIT
  400.         struct {
  401.             PKSFILTER           Filter;
  402.             ULONG_PTR           Reserved[2];
  403.         } KsFilterProcessing;
  404.         struct {
  405.             PKSPIN              Pin;
  406.             ULONG_PTR           Reserved[2];
  407.         } KsPinProcessing;
  408. // @@END_DDKSPLIT
  409. #endif // defined(_NTDDK_)
  410.         struct {
  411.             PVOID               Unused;
  412.             LONG_PTR            Alignment[2];
  413.         } Alignment;
  414.     };
  415. } KSEVENTDATA, *PKSEVENTDATA;
  416.  
  417. #define KSEVENTF_EVENT_HANDLE       0x00000001
  418. #define KSEVENTF_SEMAPHORE_HANDLE   0x00000002
  419. #if defined(_NTDDK_)
  420. #define KSEVENTF_EVENT_OBJECT       0x00000004
  421. #define KSEVENTF_SEMAPHORE_OBJECT   0x00000008
  422. #define KSEVENTF_DPC                0x00000010
  423. #define KSEVENTF_WORKITEM           0x00000020
  424. #define KSEVENTF_KSWORKITEM         0x00000080
  425. // @@BEGIN_DDKSPLIT
  426. #define KSEVENTF_KSFILTERPROCESSING 0x00000100
  427. #define KSEVENTF_KSPINPROCESSING    0x00000200
  428. // @@END_DDKSPLIT
  429. #endif // defined(_NTDDK_)
  430.  
  431. #define KSEVENT_TYPE_ENABLE         0x00000001
  432. #define KSEVENT_TYPE_ONESHOT        0x00000002
  433. #define KSEVENT_TYPE_ENABLEBUFFERED 0x00000004
  434. #define KSEVENT_TYPE_SETSUPPORT     0x00000100
  435. #define KSEVENT_TYPE_BASICSUPPORT   0x00000200
  436. #define KSEVENT_TYPE_QUERYBUFFER    0x00000400
  437.  
  438. #define KSEVENT_TYPE_TOPOLOGY 0x10000000
  439.  
  440. typedef struct {
  441.     KSEVENT         Event;
  442.     PKSEVENTDATA    EventData;
  443.     PVOID           Reserved;
  444. } KSQUERYBUFFER, *PKSQUERYBUFFER;
  445.  
  446. typedef struct {
  447.     ULONG Size;
  448.     ULONG Flags;
  449.     union {
  450.         HANDLE ObjectHandle;
  451.         PVOID ObjectPointer;
  452.     };
  453.     PVOID Reserved;
  454.     KSEVENT Event;
  455.     KSEVENTDATA EventData;
  456. } KSRELATIVEEVENT;
  457.  
  458. #define KSRELATIVEEVENT_FLAG_HANDLE 0x00000001
  459. #define KSRELATIVEEVENT_FLAG_POINTER 0x00000002
  460.  
  461. //===========================================================================
  462.  
  463. typedef struct {
  464.     KSEVENTDATA     EventData;
  465.     LONGLONG        MarkTime;
  466. } KSEVENT_TIME_MARK, *PKSEVENT_TIME_MARK;
  467.  
  468. typedef struct {
  469.     KSEVENTDATA     EventData;
  470.     LONGLONG        TimeBase;
  471.     LONGLONG        Interval;
  472. } KSEVENT_TIME_INTERVAL, *PKSEVENT_TIME_INTERVAL;
  473.  
  474. typedef struct {
  475.     LONGLONG        TimeBase;
  476.     LONGLONG        Interval;
  477. } KSINTERVAL, *PKSINTERVAL;
  478.  
  479. //===========================================================================
  480.  
  481. #define STATIC_KSPROPSETID_General\
  482.     0x1464EDA5L, 0x6A8F, 0x11D1, 0x9A, 0xA7, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  483. DEFINE_GUIDSTRUCT("1464EDA5-6A8F-11D1-9AA7-00A0C9223196", KSPROPSETID_General);
  484. #define KSPROPSETID_General DEFINE_GUIDNAMED(KSPROPSETID_General)
  485.  
  486. typedef enum {
  487.     KSPROPERTY_GENERAL_COMPONENTID
  488. } KSPROPERTY_GENERAL;
  489.  
  490. typedef struct {
  491.     GUID    Manufacturer;
  492.     GUID    Product;
  493.     GUID    Component;
  494.     GUID    Name;
  495.     ULONG   Version;
  496.     ULONG   Revision;
  497. } KSCOMPONENTID, *PKSCOMPONENTID;
  498.  
  499. #define DEFINE_KSPROPERTY_ITEM_GENERAL_COMPONENTID(Handler)\
  500.     DEFINE_KSPROPERTY_ITEM(\
  501.         KSPROPERTY_GENERAL_COMPONENTID,\
  502.         (Handler),\
  503.         sizeof(KSPROPERTY),\
  504.         sizeof(KSCOMPONENTID),\
  505.         NULL, NULL, 0, NULL, NULL, 0)
  506.  
  507. #define STATIC_KSMETHODSETID_StreamIo\
  508.     0x65D003CAL, 0x1523, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  509. DEFINE_GUIDSTRUCT("65D003CA-1523-11D2-B27A-00A0C9223196", KSMETHODSETID_StreamIo);
  510. #define KSMETHODSETID_StreamIo DEFINE_GUIDNAMED(KSMETHODSETID_StreamIo)
  511.  
  512. typedef enum {
  513.     KSMETHOD_STREAMIO_READ,
  514.     KSMETHOD_STREAMIO_WRITE
  515. } KSMETHOD_STREAMIO;
  516.  
  517. #define DEFINE_KSMETHOD_ITEM_STREAMIO_READ(Handler)\
  518.     DEFINE_KSMETHOD_ITEM(\
  519.         KSMETHOD_STREAMIO_READ,\
  520.         KSMETHOD_TYPE_WRITE,\
  521.         (Handler),\
  522.         sizeof(KSMETHOD),\
  523.         0,\
  524.         NULL)
  525.  
  526. #define DEFINE_KSMETHOD_ITEM_STREAMIO_WRITE(Handler)\
  527.     DEFINE_KSMETHOD_ITEM(\
  528.         KSMETHOD_STREAMIO_WRITE,\
  529.         KSMETHOD_TYPE_READ,\
  530.         (Handler),\
  531.         sizeof(KSMETHOD),\
  532.         0,\
  533.         NULL)
  534.  
  535. #define STATIC_KSPROPSETID_MediaSeeking\
  536.     0xEE904F0CL, 0xD09B, 0x11D0, 0xAB, 0xE9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  537. DEFINE_GUIDSTRUCT("EE904F0C-D09B-11D0-ABE9-00A0C9223196", KSPROPSETID_MediaSeeking);
  538. #define KSPROPSETID_MediaSeeking DEFINE_GUIDNAMED(KSPROPSETID_MediaSeeking)
  539.  
  540. typedef enum {
  541.     KSPROPERTY_MEDIASEEKING_CAPABILITIES,
  542.     KSPROPERTY_MEDIASEEKING_FORMATS,
  543.     KSPROPERTY_MEDIASEEKING_TIMEFORMAT,
  544.     KSPROPERTY_MEDIASEEKING_POSITION,
  545.     KSPROPERTY_MEDIASEEKING_STOPPOSITION,
  546.     KSPROPERTY_MEDIASEEKING_POSITIONS,
  547.     KSPROPERTY_MEDIASEEKING_DURATION,
  548.     KSPROPERTY_MEDIASEEKING_AVAILABLE,
  549.     KSPROPERTY_MEDIASEEKING_PREROLL,
  550.     KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT
  551. } KSPROPERTY_MEDIASEEKING;
  552.  
  553. typedef enum {
  554.     KS_SEEKING_NoPositioning,
  555.     KS_SEEKING_AbsolutePositioning,
  556.     KS_SEEKING_RelativePositioning,
  557.     KS_SEEKING_IncrementalPositioning,
  558.     KS_SEEKING_PositioningBitsMask = 0x3,
  559.     KS_SEEKING_SeekToKeyFrame,
  560.     KS_SEEKING_ReturnTime = 0x8
  561. } KS_SEEKING_FLAGS;
  562.  
  563. typedef enum {
  564.     KS_SEEKING_CanSeekAbsolute = 0x1,
  565.     KS_SEEKING_CanSeekForwards = 0x2,
  566.     KS_SEEKING_CanSeekBackwards = 0x4,
  567.     KS_SEEKING_CanGetCurrentPos = 0x8,
  568.     KS_SEEKING_CanGetStopPos = 0x10,
  569.     KS_SEEKING_CanGetDuration = 0x20,
  570.     KS_SEEKING_CanPlayBackwards = 0x40
  571. } KS_SEEKING_CAPABILITIES;
  572.  
  573. typedef struct {
  574.     LONGLONG            Current;
  575.     LONGLONG            Stop;
  576.     KS_SEEKING_FLAGS    CurrentFlags;
  577.     KS_SEEKING_FLAGS    StopFlags;
  578. } KSPROPERTY_POSITIONS, *PKSPROPERTY_POSITIONS;
  579.  
  580. typedef struct {
  581.     LONGLONG    Earliest;
  582.     LONGLONG    Latest;
  583. } KSPROPERTY_MEDIAAVAILABLE, *PKSPROPERTY_MEDIAAVAILABLE;
  584.  
  585. typedef struct {
  586.     KSPROPERTY  Property;
  587.     GUID        SourceFormat;
  588.     GUID        TargetFormat;
  589.     LONGLONG    Time;
  590. } KSP_TIMEFORMAT, *PKSP_TIMEFORMAT;
  591.  
  592. #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_CAPABILITIES(Handler)\
  593.     DEFINE_KSPROPERTY_ITEM(\
  594.         KSPROPERTY_MEDIASEEKING_CAPABILITIES,\
  595.         (Handler),\
  596.         sizeof(KSPROPERTY),\
  597.         sizeof(KS_SEEKING_CAPABILITIES),\
  598.         NULL, NULL, 0, NULL, NULL, 0)
  599.  
  600. #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_FORMATS(Handler)\
  601.     DEFINE_KSPROPERTY_ITEM(\
  602.         KSPROPERTY_MEDIASEEKING_FORMATS,\
  603.         (Handler),\
  604.         sizeof(KSPROPERTY),\
  605.         0,\
  606.         NULL, NULL, 0, NULL, NULL, 0)
  607.  
  608. #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_TIMEFORMAT(GetHandler, SetHandler)\
  609.     DEFINE_KSPROPERTY_ITEM(\
  610.         KSPROPERTY_MEDIASEEKING_TIMEFORMAT,\
  611.         (GetHandler),\
  612.         sizeof(KSPROPERTY),\
  613.         sizeof(GUID),\
  614.         (SetHandler),\
  615.         NULL, 0, NULL, NULL, 0)
  616.  
  617. #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_POSITION(Handler)\
  618.     DEFINE_KSPROPERTY_ITEM(\
  619.         KSPROPERTY_MEDIASEEKING_POSITION,\
  620.         (Handler),\
  621.         sizeof(KSPROPERTY),\
  622.         sizeof(LONGLONG),\
  623.         NULL, NULL, 0, NULL, NULL, 0)
  624.  
  625. #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_STOPPOSITION(Handler)\
  626.     DEFINE_KSPROPERTY_ITEM(\
  627.         KSPROPERTY_MEDIASEEKING_STOPPOSITION,\
  628.         (Handler),\
  629.         sizeof(KSPROPERTY),\
  630.         sizeof(LONGLONG),\
  631.         NULL, NULL, 0, NULL, NULL, 0)
  632.  
  633. #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_POSITIONS(Handler)\
  634.     DEFINE_KSPROPERTY_ITEM(\
  635.         KSPROPERTY_MEDIASEEKING_POSITIONS,\
  636.         NULL,\
  637.         sizeof(KSPROPERTY),\
  638.         sizeof(KSPROPERTY_POSITIONS),\
  639.         (Handler),\
  640.         NULL, 0, NULL, NULL, 0)
  641.  
  642. #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_DURATION(Handler)\
  643.     DEFINE_KSPROPERTY_ITEM(\
  644.         KSPROPERTY_MEDIASEEKING_DURATION,\
  645.         (Handler),\
  646.         sizeof(KSPROPERTY),\
  647.         sizeof(LONGLONG),\
  648.         NULL, NULL, 0, NULL, NULL, 0)
  649.  
  650. #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_AVAILABLE(Handler)\
  651.     DEFINE_KSPROPERTY_ITEM(\
  652.         KSPROPERTY_MEDIASEEKING_AVAILABLE,\
  653.         (Handler),\
  654.         sizeof(KSPROPERTY),\
  655.         sizeof(KSPROPERTY_MEDIAAVAILABLE),\
  656.         NULL, NULL, 0, NULL, NULL, 0)
  657.  
  658. #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_PREROLL(Handler)\
  659.     DEFINE_KSPROPERTY_ITEM(\
  660.         KSPROPERTY_MEDIASEEKING_PREROLL,\
  661.         (Handler),\
  662.         sizeof(KSPROPERTY),\
  663.         sizeof(LONGLONG),\
  664.         NULL, NULL, 0, NULL, NULL, 0)
  665.  
  666. #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_CONVERTTIMEFORMAT(Handler)\
  667.     DEFINE_KSPROPERTY_ITEM(\
  668.         KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT,\
  669.         (Handler),\
  670.         sizeof(KSP_TIMEFORMAT),\
  671.         sizeof(LONGLONG),\
  672.         NULL, NULL, 0, NULL, NULL, 0)
  673.  
  674. //===========================================================================
  675.  
  676. #define STATIC_KSPROPSETID_Topology\
  677.     0x720D4AC0L, 0x7533, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  678. DEFINE_GUIDSTRUCT("720D4AC0-7533-11D0-A5D6-28DB04C10000", KSPROPSETID_Topology);
  679. #define KSPROPSETID_Topology DEFINE_GUIDNAMED(KSPROPSETID_Topology)
  680.  
  681. typedef enum {
  682.     KSPROPERTY_TOPOLOGY_CATEGORIES,
  683.     KSPROPERTY_TOPOLOGY_NODES,
  684.     KSPROPERTY_TOPOLOGY_CONNECTIONS,
  685.     KSPROPERTY_TOPOLOGY_NAME
  686. } KSPROPERTY_TOPOLOGY;
  687.  
  688. #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CATEGORIES(Handler)\
  689.     DEFINE_KSPROPERTY_ITEM(\
  690.         KSPROPERTY_TOPOLOGY_CATEGORIES,\
  691.         (Handler),\
  692.         sizeof(KSPROPERTY),\
  693.         0,\
  694.         NULL, NULL, 0, NULL, NULL, 0)
  695.  
  696. #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NODES(Handler)\
  697.     DEFINE_KSPROPERTY_ITEM(\
  698.         KSPROPERTY_TOPOLOGY_NODES,\
  699.         (Handler),\
  700.         sizeof(KSPROPERTY),\
  701.         0,\
  702.         NULL, NULL, 0, NULL, NULL, 0)
  703.  
  704. #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CONNECTIONS(Handler)\
  705.     DEFINE_KSPROPERTY_ITEM(\
  706.         KSPROPERTY_TOPOLOGY_CONNECTIONS,\
  707.         (Handler),\
  708.         sizeof(KSPROPERTY),\
  709.         0,\
  710.         NULL, NULL, 0, NULL, NULL, 0)
  711.  
  712. #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NAME(Handler)\
  713.     DEFINE_KSPROPERTY_ITEM(\
  714.         KSPROPERTY_TOPOLOGY_NAME,\
  715.         (Handler),\
  716.         sizeof(KSP_NODE),\
  717.         0,\
  718.         NULL, NULL, 0, NULL, NULL, 0)
  719.  
  720. #define DEFINE_KSPROPERTY_TOPOLOGYSET(TopologySet, Handler)\
  721. DEFINE_KSPROPERTY_TABLE(TopologySet) {\
  722.     DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CATEGORIES(Handler),\
  723.     DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NODES(Handler),\
  724.     DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CONNECTIONS(Handler),\
  725.     DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NAME(Handler)\
  726. }
  727.  
  728. //=============================================================================
  729.  
  730. //
  731. // properties used by graph manager to talk to particular filters
  732. //
  733. #if defined(_NTDDK_)
  734.  
  735. #define STATIC_KSPROPSETID_GM \
  736.     0xAF627536L, 0xE719, 0x11D2, 0x8A, 0x1D, 0x00, 0x60, 0x97, 0xD2, 0xDF, 0x5D    
  737. DEFINE_GUIDSTRUCT("AF627536-E719-11D2-8A1D-006097D2DF5D", KSPROPSETID_GM);
  738. #define KSPROPSETID_GM DEFINE_GUIDNAMED(KSPROPSETID_GM)
  739.  
  740. typedef VOID (*PFNKSGRAPHMANAGER_NOTIFY)(IN PFILE_OBJECT GraphManager,
  741.                                          IN ULONG EventId,
  742.                                          IN PVOID Filter,
  743.                                          IN PVOID Pin,
  744.                                          IN PVOID Frame,
  745.                                          IN ULONG Duration);
  746.  
  747. typedef struct KSGRAPHMANAGER_FUNCTIONTABLE {
  748.     PFNKSGRAPHMANAGER_NOTIFY NotifyEvent;
  749. } KSGRAPHMANAGER_FUNCTIONTABLE, PKSGRAPHMANAGER_FUNCTIONTABLE;
  750.  
  751. typedef struct _KSPROPERTY_GRAPHMANAGER_INTERFACE {
  752.     PFILE_OBJECT                 GraphManager;
  753.     KSGRAPHMANAGER_FUNCTIONTABLE FunctionTable;
  754. } KSPROPERTY_GRAPHMANAGER_INTERFACE, *PKSPROPERTY_GRAPHMANAGER_INTERFACE;
  755.  
  756.  
  757. //
  758. // Commands
  759. //
  760. typedef enum {
  761.     KSPROPERTY_GM_GRAPHMANAGER,    
  762.     KSPROPERTY_GM_TIMESTAMP_CLOCK, 
  763.     KSPROPERTY_GM_RATEMATCH,       
  764.     KSPROPERTY_GM_RENDER_CLOCK,    
  765. } KSPROPERTY_GM;
  766.  
  767. #endif
  768.  
  769. //===========================================================================
  770.  
  771.  
  772. #define STATIC_KSCATEGORY_BRIDGE \
  773.     0x085AFF00L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  774. DEFINE_GUIDSTRUCT("085AFF00-62CE-11CF-A5D6-28DB04C10000", KSCATEGORY_BRIDGE);
  775. #define KSCATEGORY_BRIDGE DEFINE_GUIDNAMED(KSCATEGORY_BRIDGE)
  776.  
  777. #define STATIC_KSCATEGORY_CAPTURE \
  778.     0x65E8773DL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  779. DEFINE_GUIDSTRUCT("65E8773D-8F56-11D0-A3B9-00A0C9223196", KSCATEGORY_CAPTURE);
  780. #define KSCATEGORY_CAPTURE DEFINE_GUIDNAMED(KSCATEGORY_CAPTURE)
  781.  
  782. #define STATIC_KSCATEGORY_RENDER \
  783.     0x65E8773EL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  784. DEFINE_GUIDSTRUCT("65E8773E-8F56-11D0-A3B9-00A0C9223196", KSCATEGORY_RENDER);
  785. #define KSCATEGORY_RENDER DEFINE_GUIDNAMED(KSCATEGORY_RENDER)
  786.  
  787. #define STATIC_KSCATEGORY_MIXER \
  788.     0xAD809C00L, 0x7B88, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  789. DEFINE_GUIDSTRUCT("AD809C00-7B88-11D0-A5D6-28DB04C10000", KSCATEGORY_MIXER);
  790. #define KSCATEGORY_MIXER DEFINE_GUIDNAMED(KSCATEGORY_MIXER)
  791.  
  792. #define STATIC_KSCATEGORY_SPLITTER \
  793.     0x0A4252A0L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  794. DEFINE_GUIDSTRUCT("0A4252A0-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_SPLITTER);
  795. #define KSCATEGORY_SPLITTER DEFINE_GUIDNAMED(KSCATEGORY_SPLITTER)
  796.  
  797. #define STATIC_KSCATEGORY_DATACOMPRESSOR \
  798.     0x1E84C900L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  799. DEFINE_GUIDSTRUCT("1E84C900-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATACOMPRESSOR);
  800. #define KSCATEGORY_DATACOMPRESSOR DEFINE_GUIDNAMED(KSCATEGORY_DATACOMPRESSOR)
  801.  
  802. #define STATIC_KSCATEGORY_DATADECOMPRESSOR \
  803.     0x2721AE20L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  804. DEFINE_GUIDSTRUCT("2721AE20-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATADECOMPRESSOR);
  805. #define KSCATEGORY_DATADECOMPRESSOR DEFINE_GUIDNAMED(KSCATEGORY_DATADECOMPRESSOR)
  806.  
  807. #define STATIC_KSCATEGORY_DATATRANSFORM \
  808.     0x2EB07EA0L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  809. DEFINE_GUIDSTRUCT("2EB07EA0-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATATRANSFORM);
  810. #define KSCATEGORY_DATATRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_DATATRANSFORM)
  811.  
  812. #define STATIC_KSCATEGORY_COMMUNICATIONSTRANSFORM \
  813.     0xCF1DDA2CL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  814. DEFINE_GUIDSTRUCT("CF1DDA2C-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_COMMUNICATIONSTRANSFORM);
  815. #define KSCATEGORY_COMMUNICATIONSTRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_COMMUNICATIONSTRANSFORM)
  816.  
  817. #define STATIC_KSCATEGORY_INTERFACETRANSFORM \
  818.     0xCF1DDA2DL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  819. DEFINE_GUIDSTRUCT("CF1DDA2D-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_INTERFACETRANSFORM);
  820. #define KSCATEGORY_INTERFACETRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_INTERFACETRANSFORM)
  821.  
  822. #define STATIC_KSCATEGORY_MEDIUMTRANSFORM \
  823.     0xCF1DDA2EL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  824. DEFINE_GUIDSTRUCT("CF1DDA2E-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_MEDIUMTRANSFORM);
  825. #define KSCATEGORY_MEDIUMTRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_MEDIUMTRANSFORM)
  826.  
  827. #define STATIC_KSCATEGORY_FILESYSTEM \
  828.     0x760FED5EL, 0x9357, 0x11D0, 0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  829. DEFINE_GUIDSTRUCT("760FED5E-9357-11D0-A3CC-00A0C9223196", KSCATEGORY_FILESYSTEM);
  830. #define KSCATEGORY_FILESYSTEM DEFINE_GUIDNAMED(KSCATEGORY_FILESYSTEM)
  831.  
  832. // KSNAME_Clock
  833. #define STATIC_KSCATEGORY_CLOCK \
  834.     0x53172480L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  835. DEFINE_GUIDSTRUCT("53172480-4791-11D0-A5D6-28DB04C10000", KSCATEGORY_CLOCK);
  836. #define KSCATEGORY_CLOCK DEFINE_GUIDNAMED(KSCATEGORY_CLOCK)
  837.  
  838. #define STATIC_KSCATEGORY_PROXY \
  839.     0x97EBAACAL, 0x95BD, 0x11D0, 0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  840. DEFINE_GUIDSTRUCT("97EBAACA-95BD-11D0-A3EA-00A0C9223196", KSCATEGORY_PROXY);
  841. #define KSCATEGORY_PROXY DEFINE_GUIDNAMED(KSCATEGORY_PROXY)
  842.  
  843. #define STATIC_KSCATEGORY_QUALITY \
  844.     0x97EBAACBL, 0x95BD, 0x11D0, 0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  845. DEFINE_GUIDSTRUCT("97EBAACB-95BD-11D0-A3EA-00A0C9223196", KSCATEGORY_QUALITY);
  846. #define KSCATEGORY_QUALITY DEFINE_GUIDNAMED(KSCATEGORY_QUALITY)
  847.  
  848. typedef struct {
  849.     ULONG   FromNode;
  850.     ULONG   FromNodePin;
  851.     ULONG   ToNode;
  852.     ULONG   ToNodePin;
  853. } KSTOPOLOGY_CONNECTION, *PKSTOPOLOGY_CONNECTION;
  854.  
  855. typedef struct {
  856.     ULONG                           CategoriesCount;
  857.     const GUID*                     Categories;
  858.     ULONG                           TopologyNodesCount;
  859.     const GUID*                     TopologyNodes;
  860.     ULONG                           TopologyConnectionsCount;
  861.     const KSTOPOLOGY_CONNECTION*    TopologyConnections;
  862.     const GUID*                     TopologyNodesNames;
  863.     ULONG                           Reserved;
  864. } KSTOPOLOGY, *PKSTOPOLOGY;
  865.  
  866. #define KSFILTER_NODE   ((ULONG)-1)
  867. #define KSALL_NODES     ((ULONG)-1)
  868.  
  869. typedef struct {
  870.     ULONG       CreateFlags;
  871.     ULONG       Node;
  872. } KSNODE_CREATE, *PKSNODE_CREATE;
  873.  
  874. //===========================================================================
  875.  
  876. // TIME_FORMAT_NONE
  877. #define STATIC_KSTIME_FORMAT_NONE       STATIC_GUID_NULL
  878. #define KSTIME_FORMAT_NONE              GUID_NULL
  879.  
  880. // TIME_FORMAT_FRAME
  881. #define STATIC_KSTIME_FORMAT_FRAME\
  882.     0x7b785570L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6
  883. DEFINE_GUIDSTRUCT("7b785570-8c82-11cf-bc0c-00aa00ac74f6", KSTIME_FORMAT_FRAME);
  884. #define KSTIME_FORMAT_FRAME DEFINE_GUIDNAMED(KSTIME_FORMAT_FRAME)
  885.  
  886. // TIME_FORMAT_BYTE             
  887. #define STATIC_KSTIME_FORMAT_BYTE\
  888.     0x7b785571L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6
  889. DEFINE_GUIDSTRUCT("7b785571-8c82-11cf-bc0c-00aa00ac74f6", KSTIME_FORMAT_BYTE);
  890. #define KSTIME_FORMAT_BYTE DEFINE_GUIDNAMED(KSTIME_FORMAT_BYTE)
  891.  
  892. // TIME_FORMAT_SAMPLE
  893. #define STATIC_KSTIME_FORMAT_SAMPLE\
  894.     0x7b785572L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6
  895. DEFINE_GUIDSTRUCT("7b785572-8c82-11cf-bc0c-00aa00ac74f6", KSTIME_FORMAT_SAMPLE);
  896. #define KSTIME_FORMAT_SAMPLE DEFINE_GUIDNAMED(KSTIME_FORMAT_SAMPLE)
  897.  
  898. // TIME_FORMAT_FIELD
  899. #define STATIC_KSTIME_FORMAT_FIELD\
  900.     0x7b785573L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6
  901. DEFINE_GUIDSTRUCT("7b785573-8c82-11cf-bc0c-00aa00ac74f6", KSTIME_FORMAT_FIELD);
  902. #define KSTIME_FORMAT_FIELD DEFINE_GUIDNAMED(KSTIME_FORMAT_FIELD)
  903.  
  904. // TIME_FORMAT_MEDIA_TIME
  905. #define STATIC_KSTIME_FORMAT_MEDIA_TIME\
  906.     0x7b785574L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6
  907. DEFINE_GUIDSTRUCT("7b785574-8c82-11cf-bc0c-00aa00ac74f6", KSTIME_FORMAT_MEDIA_TIME);
  908. #define KSTIME_FORMAT_MEDIA_TIME DEFINE_GUIDNAMED(KSTIME_FORMAT_MEDIA_TIME)
  909.  
  910. //===========================================================================
  911.  
  912. typedef KSIDENTIFIER KSPIN_INTERFACE, *PKSPIN_INTERFACE;
  913.  
  914. #define STATIC_KSINTERFACESETID_Standard \
  915.     0x1A8766A0L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  916. DEFINE_GUIDSTRUCT("1A8766A0-62CE-11CF-A5D6-28DB04C10000", KSINTERFACESETID_Standard);
  917. #define KSINTERFACESETID_Standard DEFINE_GUIDNAMED(KSINTERFACESETID_Standard)
  918.  
  919. typedef enum {
  920.     KSINTERFACE_STANDARD_STREAMING,
  921.     KSINTERFACE_STANDARD_LOOPED_STREAMING,
  922.     KSINTERFACE_STANDARD_CONTROL
  923. } KSINTERFACE_STANDARD;
  924.  
  925. #define STATIC_KSINTERFACESETID_FileIo \
  926.     0x8C6F932CL, 0xE771, 0x11D0, 0xB8, 0xFF, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  927. DEFINE_GUIDSTRUCT("8C6F932C-E771-11D0-B8FF-00A0C9223196", KSINTERFACESETID_FileIo);
  928. #define KSINTERFACESETID_FileIo DEFINE_GUIDNAMED(KSINTERFACESETID_FileIo)
  929.  
  930. typedef enum {
  931.     KSINTERFACE_FILEIO_STREAMING
  932. } KSINTERFACE_FILEIO;
  933.  
  934. //===========================================================================
  935.  
  936. #define KSMEDIUM_TYPE_ANYINSTANCE       0
  937.  
  938. #define STATIC_KSMEDIUMSETID_Standard \
  939.     0x4747B320L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  940. DEFINE_GUIDSTRUCT("4747B320-62CE-11CF-A5D6-28DB04C10000", KSMEDIUMSETID_Standard);
  941. #define KSMEDIUMSETID_Standard DEFINE_GUIDNAMED(KSMEDIUMSETID_Standard)
  942.  
  943. //For compatibility only
  944. #define KSMEDIUM_STANDARD_DEVIO     KSMEDIUM_TYPE_ANYINSTANCE
  945.  
  946. //===========================================================================
  947.  
  948. #define STATIC_KSPROPSETID_Pin\
  949.     0x8C134960L, 0x51AD, 0x11CF, 0x87, 0x8A, 0x94, 0xF8, 0x01, 0xC1, 0x00, 0x00
  950. DEFINE_GUIDSTRUCT("8C134960-51AD-11CF-878A-94F801C10000", KSPROPSETID_Pin);
  951. #define KSPROPSETID_Pin DEFINE_GUIDNAMED(KSPROPSETID_Pin)
  952.  
  953. typedef enum {
  954.     KSPROPERTY_PIN_CINSTANCES,
  955.     KSPROPERTY_PIN_CTYPES,
  956.     KSPROPERTY_PIN_DATAFLOW,
  957.     KSPROPERTY_PIN_DATARANGES,
  958.     KSPROPERTY_PIN_DATAINTERSECTION,
  959.     KSPROPERTY_PIN_INTERFACES,
  960.     KSPROPERTY_PIN_MEDIUMS,
  961.     KSPROPERTY_PIN_COMMUNICATION,
  962.     KSPROPERTY_PIN_GLOBALCINSTANCES,
  963.     KSPROPERTY_PIN_NECESSARYINSTANCES,
  964.     KSPROPERTY_PIN_PHYSICALCONNECTION,
  965.     KSPROPERTY_PIN_CATEGORY,
  966.     KSPROPERTY_PIN_NAME,
  967.     KSPROPERTY_PIN_CONSTRAINEDDATARANGES,
  968.     KSPROPERTY_PIN_PROPOSEDATAFORMAT
  969. } KSPROPERTY_PIN;
  970.  
  971. typedef struct {
  972.     KSPROPERTY      Property;
  973.     ULONG           PinId;
  974.     ULONG           Reserved;
  975. } KSP_PIN, *PKSP_PIN;
  976.  
  977. #define KSINSTANCE_INDETERMINATE    ((ULONG)-1)
  978.  
  979. typedef struct {
  980.     ULONG  PossibleCount;
  981.     ULONG  CurrentCount;
  982. } KSPIN_CINSTANCES, *PKSPIN_CINSTANCES;
  983.  
  984. typedef enum {
  985.     KSPIN_DATAFLOW_IN = 1,
  986.     KSPIN_DATAFLOW_OUT
  987. } KSPIN_DATAFLOW, *PKSPIN_DATAFLOW;
  988.  
  989. #define KSDATAFORMAT_BIT_TEMPORAL_COMPRESSION   0
  990. #define KSDATAFORMAT_TEMPORAL_COMPRESSION       (1 << KSDATAFORMAT_BIT_TEMPORAL_COMPRESSION)
  991. #define KSDATAFORMAT_BIT_ATTRIBUTES 1
  992. #define KSDATAFORMAT_ATTRIBUTES (1 << KSDATAFORMAT_BIT_ATTRIBUTES)
  993.  
  994. #define KSDATARANGE_BIT_ATTRIBUTES 1
  995. #define KSDATARANGE_ATTRIBUTES (1 << KSDATARANGE_BIT_ATTRIBUTES)
  996. #define KSDATARANGE_BIT_REQUIRED_ATTRIBUTES 2
  997. #define KSDATARANGE_REQUIRED_ATTRIBUTES (1 << KSDATARANGE_BIT_REQUIRED_ATTRIBUTES)
  998.  
  999. #if !defined( _MSC_VER ) 
  1000. typedef struct {
  1001.     ULONG   FormatSize;
  1002.     ULONG   Flags;
  1003.     ULONG   SampleSize;
  1004.     ULONG   Reserved;
  1005.     GUID    MajorFormat;
  1006.     GUID    SubFormat;
  1007.     GUID    Specifier;
  1008. } KSDATAFORMAT, *PKSDATAFORMAT, KSDATARANGE, *PKSDATARANGE;
  1009. #else
  1010. typedef union {
  1011.     struct {
  1012.         ULONG   FormatSize;
  1013.         ULONG   Flags;
  1014.         ULONG   SampleSize;
  1015.         ULONG   Reserved;
  1016.         GUID    MajorFormat;
  1017.         GUID    SubFormat;
  1018.         GUID    Specifier;
  1019.     };
  1020.     LONGLONG    Alignment;
  1021. } KSDATAFORMAT, *PKSDATAFORMAT, KSDATARANGE, *PKSDATARANGE;
  1022. #endif
  1023.  
  1024. #define KSATTRIBUTE_REQUIRED 0x00000001
  1025.  
  1026. typedef struct {
  1027.     ULONG Size;
  1028.     ULONG Flags;
  1029.     GUID Attribute;
  1030. } KSATTRIBUTE, *PKSATTRIBUTE;
  1031.  
  1032. #if defined(_NTDDK_)
  1033. typedef struct {
  1034.     ULONG Count;
  1035.     PKSATTRIBUTE* Attributes;
  1036. } KSATTRIBUTE_LIST, *PKSATTRIBUTE_LIST;
  1037. #endif // _NTDDK_
  1038.  
  1039. typedef enum {
  1040.     KSPIN_COMMUNICATION_NONE,
  1041.     KSPIN_COMMUNICATION_SINK,
  1042.     KSPIN_COMMUNICATION_SOURCE,
  1043.     KSPIN_COMMUNICATION_BOTH,
  1044.     KSPIN_COMMUNICATION_BRIDGE
  1045. } KSPIN_COMMUNICATION, *PKSPIN_COMMUNICATION;
  1046.  
  1047. typedef KSIDENTIFIER KSPIN_MEDIUM, *PKSPIN_MEDIUM;
  1048.  
  1049. typedef struct {
  1050.     KSPIN_INTERFACE Interface;
  1051.     KSPIN_MEDIUM    Medium;
  1052.     ULONG           PinId;
  1053.     HANDLE          PinToHandle;
  1054.     KSPRIORITY      Priority;
  1055. } KSPIN_CONNECT, *PKSPIN_CONNECT;
  1056.  
  1057. typedef struct {
  1058.     ULONG   Size;
  1059.     ULONG   Pin;
  1060.     WCHAR   SymbolicLinkName[1];
  1061. } KSPIN_PHYSICALCONNECTION, *PKSPIN_PHYSICALCONNECTION;
  1062.  
  1063. #if defined(_NTDDK_)
  1064. typedef
  1065. NTSTATUS
  1066. (*PFNKSINTERSECTHANDLER)(
  1067.     IN PIRP Irp,
  1068.     IN PKSP_PIN Pin,
  1069.     IN PKSDATARANGE DataRange,
  1070.     OUT PVOID Data OPTIONAL
  1071.     );
  1072. typedef
  1073. NTSTATUS
  1074. (*PFNKSINTERSECTHANDLEREX)(
  1075.     IN PVOID Context,
  1076.     IN PIRP Irp,
  1077.     IN PKSP_PIN Pin,
  1078.     IN PKSDATARANGE DataRange,
  1079.     IN PKSDATARANGE MatchingDataRange,
  1080.     IN ULONG DataBufferSize,
  1081.     OUT PVOID Data OPTIONAL,
  1082.     OUT PULONG DataSize
  1083.     );
  1084. #endif // _NTDDK_
  1085.  
  1086. #define DEFINE_KSPIN_INTERFACE_TABLE(tablename)\
  1087.     const KSPIN_INTERFACE tablename[] =
  1088.  
  1089. #define DEFINE_KSPIN_INTERFACE_ITEM(guid, interface)\
  1090.     {\
  1091.         STATICGUIDOF(guid),\
  1092.         (interface),\
  1093.         0\
  1094.     }
  1095.  
  1096. #define DEFINE_KSPIN_MEDIUM_TABLE( tablename )\
  1097.     const KSPIN_MEDIUM tablename[] =
  1098.  
  1099. #define DEFINE_KSPIN_MEDIUM_ITEM(guid, medium)\
  1100.     DEFINE_KSPIN_INTERFACE_ITEM(guid, medium)
  1101.  
  1102. #define DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(Handler)\
  1103.     DEFINE_KSPROPERTY_ITEM(\
  1104.         KSPROPERTY_PIN_CINSTANCES,\
  1105.         (Handler),\
  1106.         sizeof(KSP_PIN),\
  1107.         sizeof(KSPIN_CINSTANCES),\
  1108.         NULL, NULL, 0, NULL, NULL, 0)
  1109.  
  1110. #define DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(Handler)\
  1111.     DEFINE_KSPROPERTY_ITEM(\
  1112.         KSPROPERTY_PIN_CTYPES,\
  1113.         (Handler),\
  1114.         sizeof(KSPROPERTY),\
  1115.         sizeof(ULONG),\
  1116.         NULL, NULL, 0, NULL, NULL, 0)
  1117.  
  1118. #define DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(Handler)\
  1119.     DEFINE_KSPROPERTY_ITEM(\
  1120.         KSPROPERTY_PIN_DATAFLOW,\
  1121.         (Handler),\
  1122.         sizeof(KSP_PIN),\
  1123.         sizeof(KSPIN_DATAFLOW),\
  1124.         NULL, NULL, 0, NULL, NULL, 0)
  1125.  
  1126. #define DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(Handler)\
  1127.     DEFINE_KSPROPERTY_ITEM(\
  1128.         KSPROPERTY_PIN_DATARANGES,\
  1129.         (Handler),\
  1130.         sizeof(KSP_PIN),\
  1131.         0,\
  1132.         NULL, NULL, 0, NULL, NULL, 0)
  1133.  
  1134. #define DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(Handler)\
  1135.     DEFINE_KSPROPERTY_ITEM(\
  1136.         KSPROPERTY_PIN_DATAINTERSECTION,\
  1137.         (Handler),\
  1138.         sizeof(KSP_PIN) + sizeof(KSMULTIPLE_ITEM),\
  1139.         0,\
  1140.         NULL, NULL, 0, NULL, NULL, 0)
  1141.  
  1142. #define DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(Handler)\
  1143.     DEFINE_KSPROPERTY_ITEM(\
  1144.         KSPROPERTY_PIN_INTERFACES,\
  1145.         (Handler),\
  1146.         sizeof(KSP_PIN),\
  1147.         0,\
  1148.         NULL, NULL, 0, NULL, NULL, 0)
  1149.  
  1150. #define DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(Handler)\
  1151.     DEFINE_KSPROPERTY_ITEM(\
  1152.         KSPROPERTY_PIN_MEDIUMS,\
  1153.         (Handler),\
  1154.         sizeof(KSP_PIN),\
  1155.         0,\
  1156.         NULL, NULL, 0, NULL, NULL, 0)
  1157.  
  1158. #define DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(Handler)\
  1159.     DEFINE_KSPROPERTY_ITEM(\
  1160.         KSPROPERTY_PIN_COMMUNICATION,\
  1161.         (Handler),\
  1162.         sizeof(KSP_PIN),\
  1163.         sizeof(KSPIN_COMMUNICATION),\
  1164.         NULL, NULL, 0, NULL, NULL, 0)
  1165.  
  1166. #define DEFINE_KSPROPERTY_ITEM_PIN_GLOBALCINSTANCES(Handler)\
  1167.     DEFINE_KSPROPERTY_ITEM(\
  1168.         KSPROPERTY_PIN_GLOBALCINSTANCES,\
  1169.         (Handler),\
  1170.         sizeof(KSP_PIN),\
  1171.         sizeof(KSPIN_CINSTANCES),\
  1172.         NULL, NULL, 0, NULL, NULL, 0)
  1173.  
  1174. #define DEFINE_KSPROPERTY_ITEM_PIN_NECESSARYINSTANCES(Handler)\
  1175.     DEFINE_KSPROPERTY_ITEM(\
  1176.         KSPROPERTY_PIN_NECESSARYINSTANCES,\
  1177.         (Handler),\
  1178.         sizeof(KSP_PIN),\
  1179.         sizeof(ULONG),\
  1180.         NULL, NULL, 0, NULL, NULL, 0)
  1181.  
  1182. #define DEFINE_KSPROPERTY_ITEM_PIN_PHYSICALCONNECTION(Handler)\
  1183.     DEFINE_KSPROPERTY_ITEM(\
  1184.         KSPROPERTY_PIN_PHYSICALCONNECTION,\
  1185.         (Handler),\
  1186.         sizeof(KSP_PIN),\
  1187.         0,\
  1188.         NULL, NULL, 0, NULL, NULL, 0)
  1189.  
  1190. #define DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(Handler)\
  1191.     DEFINE_KSPROPERTY_ITEM(\
  1192.         KSPROPERTY_PIN_CATEGORY,\
  1193.         (Handler),\
  1194.         sizeof(KSP_PIN),\
  1195.         sizeof(GUID),\
  1196.         NULL, NULL, 0, NULL, NULL, 0)
  1197.  
  1198. #define DEFINE_KSPROPERTY_ITEM_PIN_NAME(Handler)\
  1199.     DEFINE_KSPROPERTY_ITEM(\
  1200.         KSPROPERTY_PIN_NAME,\
  1201.         (Handler),\
  1202.         sizeof(KSP_PIN),\
  1203.         0,\
  1204.         NULL, NULL, 0, NULL, NULL, 0)
  1205.  
  1206. #define DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(Handler)\
  1207.     DEFINE_KSPROPERTY_ITEM(\
  1208.         KSPROPERTY_PIN_CONSTRAINEDDATARANGES,\
  1209.         (Handler),\
  1210.         sizeof(KSP_PIN),\
  1211.         0,\
  1212.         NULL, NULL, 0, NULL, NULL, 0)
  1213.  
  1214. #define DEFINE_KSPROPERTY_ITEM_PIN_PROPOSEDATAFORMAT(Handler)\
  1215.     DEFINE_KSPROPERTY_ITEM(\
  1216.         KSPROPERTY_PIN_PROPOSEDATAFORMAT,\
  1217.         NULL,\
  1218.         sizeof(KSP_PIN),\
  1219.         sizeof(KSDATAFORMAT),\
  1220.         (Handler), NULL, 0, NULL, NULL, 0)
  1221.  
  1222. #define DEFINE_KSPROPERTY_PINSET(PinSet,\
  1223.     PropGeneral, PropInstances, PropIntersection)\
  1224. DEFINE_KSPROPERTY_TABLE(PinSet) {\
  1225.     DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(PropInstances),\
  1226.     DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(PropGeneral),\
  1227.     DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(PropGeneral),\
  1228.     DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(PropGeneral),\
  1229.     DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(PropIntersection),\
  1230.     DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(PropGeneral),\
  1231.     DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(PropGeneral),\
  1232.     DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(PropGeneral),\
  1233.     DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(PropGeneral),\
  1234.     DEFINE_KSPROPERTY_ITEM_PIN_NAME(PropGeneral)\
  1235. }
  1236.  
  1237. #define DEFINE_KSPROPERTY_PINSETCONSTRAINED(PinSet,\
  1238.     PropGeneral, PropInstances, PropIntersection)\
  1239. DEFINE_KSPROPERTY_TABLE(PinSet) {\
  1240.     DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(PropInstances),\
  1241.     DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(PropGeneral),\
  1242.     DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(PropGeneral),\
  1243.     DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(PropGeneral),\
  1244.     DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(PropIntersection),\
  1245.     DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(PropGeneral),\
  1246.     DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(PropGeneral),\
  1247.     DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(PropGeneral),\
  1248.     DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(PropGeneral),\
  1249.     DEFINE_KSPROPERTY_ITEM_PIN_NAME(PropGeneral),\
  1250.     DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(PropGeneral)\
  1251. }
  1252.  
  1253. #define STATIC_KSNAME_Filter\
  1254.     0x9b365890L, 0x165f, 0x11d0, 0xa1, 0x95, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
  1255. DEFINE_GUIDSTRUCT("9b365890-165f-11d0-a195-0020afd156e4", KSNAME_Filter);
  1256. #define KSNAME_Filter DEFINE_GUIDNAMED(KSNAME_Filter)
  1257.  
  1258. #define KSSTRING_Filter L"{9B365890-165F-11D0-A195-0020AFD156E4}"
  1259.  
  1260. #define STATIC_KSNAME_Pin\
  1261.     0x146F1A80L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  1262. DEFINE_GUIDSTRUCT("146F1A80-4791-11D0-A5D6-28DB04C10000", KSNAME_Pin);
  1263. #define KSNAME_Pin DEFINE_GUIDNAMED(KSNAME_Pin)
  1264.  
  1265. #define KSSTRING_Pin L"{146F1A80-4791-11D0-A5D6-28DB04C10000}"
  1266.  
  1267. #define STATIC_KSNAME_Clock\
  1268.     0x53172480L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  1269. DEFINE_GUIDSTRUCT("53172480-4791-11D0-A5D6-28DB04C10000", KSNAME_Clock);
  1270. #define KSNAME_Clock DEFINE_GUIDNAMED(KSNAME_Clock)
  1271.  
  1272. #define KSSTRING_Clock L"{53172480-4791-11D0-A5D6-28DB04C10000}"
  1273.  
  1274. #define STATIC_KSNAME_Allocator\
  1275.     0x642F5D00L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  1276. DEFINE_GUIDSTRUCT("642F5D00-4791-11D0-A5D6-28DB04C10000", KSNAME_Allocator);
  1277. #define KSNAME_Allocator DEFINE_GUIDNAMED(KSNAME_Allocator)
  1278.  
  1279. #define KSSTRING_Allocator L"{642F5D00-4791-11D0-A5D6-28DB04C10000}"
  1280.  
  1281. #define KSSTRING_AllocatorEx L"{091BB63B-603F-11D1-B067-00A0C9062802}"
  1282.  
  1283. #define STATIC_KSNAME_TopologyNode\
  1284.     0x0621061AL, 0xEE75, 0x11D0, 0xB9, 0x15, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  1285. DEFINE_GUIDSTRUCT("0621061A-EE75-11D0-B915-00A0C9223196", KSNAME_TopologyNode);
  1286. #define KSNAME_TopologyNode DEFINE_GUIDNAMED(KSNAME_TopologyNode)
  1287.  
  1288. #define KSSTRING_TopologyNode L"{0621061A-EE75-11D0-B915-00A0C9223196}"
  1289.  
  1290. #if defined(_NTDDK_)
  1291.  
  1292. typedef struct {
  1293.     ULONG                   InterfacesCount;
  1294.     const KSPIN_INTERFACE*  Interfaces;
  1295.     ULONG                   MediumsCount;
  1296.     const KSPIN_MEDIUM*     Mediums;
  1297.     ULONG                   DataRangesCount;
  1298.     const PKSDATARANGE*     DataRanges;
  1299.     KSPIN_DATAFLOW          DataFlow;
  1300.     KSPIN_COMMUNICATION     Communication;
  1301.     const GUID*             Category;
  1302.     const GUID*             Name;
  1303.     union {
  1304.         LONGLONG            Reserved;
  1305.         struct {
  1306.             ULONG           ConstrainedDataRangesCount;
  1307.             PKSDATARANGE*   ConstrainedDataRanges;
  1308.         };
  1309.     };
  1310. } KSPIN_DESCRIPTOR, *PKSPIN_DESCRIPTOR;
  1311. typedef const KSPIN_DESCRIPTOR *PCKSPIN_DESCRIPTOR;
  1312.  
  1313. #define DEFINE_KSPIN_DESCRIPTOR_TABLE(tablename)\
  1314.     const KSPIN_DESCRIPTOR tablename[] =
  1315.  
  1316. #define DEFINE_KSPIN_DESCRIPTOR_ITEM(\
  1317.     InterfacesCount, Interfaces,\
  1318.     MediumsCount, Mediums,\
  1319.     DataRangesCount, DataRanges,\
  1320.     DataFlow, Communication)\
  1321. {\
  1322.     InterfacesCount, Interfaces, MediumsCount, Mediums,\
  1323.     DataRangesCount, DataRanges, DataFlow, Communication,\
  1324.     NULL, NULL, 0\
  1325. }
  1326. #define DEFINE_KSPIN_DESCRIPTOR_ITEMEX(\
  1327.     InterfacesCount, Interfaces,\
  1328.     MediumsCount, Mediums,\
  1329.     DataRangesCount, DataRanges,\
  1330.     DataFlow, Communication,\
  1331.     Category, Name)\
  1332. {\
  1333.     InterfacesCount, Interfaces, MediumsCount, Mediums,\
  1334.     DataRangesCount, DataRanges, DataFlow, Communication,\
  1335.     Category, Name, 0\
  1336. }
  1337.  
  1338. #endif // defined(_NTDDK_)
  1339.  
  1340. //===========================================================================
  1341.  
  1342. // MEDIATYPE_NULL
  1343. #define STATIC_KSDATAFORMAT_TYPE_WILDCARD       STATIC_GUID_NULL
  1344. #define KSDATAFORMAT_TYPE_WILDCARD              GUID_NULL
  1345.  
  1346. // MEDIASUBTYPE_NULL
  1347. #define STATIC_KSDATAFORMAT_SUBTYPE_WILDCARD    STATIC_GUID_NULL
  1348. #define KSDATAFORMAT_SUBTYPE_WILDCARD           GUID_NULL
  1349.  
  1350. // MEDIATYPE_Stream
  1351. #define STATIC_KSDATAFORMAT_TYPE_STREAM\
  1352.     0xE436EB83L, 0x524F, 0x11CE, 0x9F, 0x53, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70
  1353. DEFINE_GUIDSTRUCT("E436EB83-524F-11CE-9F53-0020AF0BA770", KSDATAFORMAT_TYPE_STREAM);
  1354. #define KSDATAFORMAT_TYPE_STREAM DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_STREAM)
  1355.  
  1356. // MEDIASUBTYPE_None
  1357. #define STATIC_KSDATAFORMAT_SUBTYPE_NONE\
  1358.     0xE436EB8EL, 0x524F, 0x11CE, 0x9F, 0x53, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70
  1359. DEFINE_GUIDSTRUCT("E436EB8E-524F-11CE-9F53-0020AF0BA770", KSDATAFORMAT_SUBTYPE_NONE);
  1360. #define KSDATAFORMAT_SUBTYPE_NONE DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_NONE)
  1361.  
  1362. #define STATIC_KSDATAFORMAT_SPECIFIER_WILDCARD  STATIC_GUID_NULL
  1363. #define KSDATAFORMAT_SPECIFIER_WILDCARD         GUID_NULL
  1364.  
  1365. #define STATIC_KSDATAFORMAT_SPECIFIER_FILENAME\
  1366.     0xAA797B40L, 0xE974, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  1367. DEFINE_GUIDSTRUCT("AA797B40-E974-11CF-A5D6-28DB04C10000", KSDATAFORMAT_SPECIFIER_FILENAME);
  1368. #define KSDATAFORMAT_SPECIFIER_FILENAME DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_FILENAME)
  1369.  
  1370. #define STATIC_KSDATAFORMAT_SPECIFIER_FILEHANDLE\
  1371.     0x65E8773CL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  1372. DEFINE_GUIDSTRUCT("65E8773C-8F56-11D0-A3B9-00A0C9223196", KSDATAFORMAT_SPECIFIER_FILEHANDLE);
  1373. #define KSDATAFORMAT_SPECIFIER_FILEHANDLE DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_FILEHANDLE)
  1374.  
  1375. // FORMAT_None
  1376. #define STATIC_KSDATAFORMAT_SPECIFIER_NONE\
  1377.     0x0F6417D6L, 0xC318, 0x11D0, 0xA4, 0x3F, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  1378. DEFINE_GUIDSTRUCT("0F6417D6-C318-11D0-A43F-00A0C9223196", KSDATAFORMAT_SPECIFIER_NONE);
  1379. #define KSDATAFORMAT_SPECIFIER_NONE DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_NONE)
  1380.  
  1381. //===========================================================================
  1382.  
  1383. #define STATIC_KSPROPSETID_Quality \
  1384.     0xD16AD380L, 0xAC1A, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  1385. DEFINE_GUIDSTRUCT("D16AD380-AC1A-11CF-A5D6-28DB04C10000", KSPROPSETID_Quality);
  1386. #define KSPROPSETID_Quality DEFINE_GUIDNAMED(KSPROPSETID_Quality)
  1387.  
  1388. typedef enum {
  1389.     KSPROPERTY_QUALITY_REPORT,
  1390.     KSPROPERTY_QUALITY_ERROR
  1391. } KSPROPERTY_QUALITY;
  1392.  
  1393. #define DEFINE_KSPROPERTY_ITEM_QUALITY_REPORT(GetHandler, SetHandler)\
  1394.     DEFINE_KSPROPERTY_ITEM(\
  1395.         KSPROPERTY_QUALITY_REPORT,\
  1396.         (GetHandler),\
  1397.         sizeof(KSPROPERTY),\
  1398.         sizeof(KSQUALITY),\
  1399.         (SetHandler),\
  1400.         NULL, 0, NULL, NULL, 0)
  1401.  
  1402. #define DEFINE_KSPROPERTY_ITEM_QUALITY_ERROR(GetHandler, SetHandler)\
  1403.     DEFINE_KSPROPERTY_ITEM(\
  1404.         KSPROPERTY_QUALITY_ERROR,\
  1405.         (GetHandler),\
  1406.         sizeof(KSPROPERTY),\
  1407.         sizeof(KSERROR),\
  1408.         (SetHandler),\
  1409.         NULL, 0, NULL, NULL, 0)
  1410.  
  1411. //===========================================================================
  1412.  
  1413. #define STATIC_KSPROPSETID_Connection \
  1414.     0x1D58C920L, 0xAC9B, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  1415. DEFINE_GUIDSTRUCT("1D58C920-AC9B-11CF-A5D6-28DB04C10000", KSPROPSETID_Connection);
  1416. #define KSPROPSETID_Connection DEFINE_GUIDNAMED(KSPROPSETID_Connection)
  1417.  
  1418. typedef enum {
  1419.     KSPROPERTY_CONNECTION_STATE,
  1420.     KSPROPERTY_CONNECTION_PRIORITY,
  1421.     KSPROPERTY_CONNECTION_DATAFORMAT,
  1422.     KSPROPERTY_CONNECTION_ALLOCATORFRAMING,
  1423.     KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT,
  1424.     KSPROPERTY_CONNECTION_ACQUIREORDERING,
  1425.     KSPROPERTY_CONNECTION_ALLOCATORFRAMING_EX,
  1426.     KSPROPERTY_CONNECTION_STARTAT
  1427. } KSPROPERTY_CONNECTION;
  1428.  
  1429. #define DEFINE_KSPROPERTY_ITEM_CONNECTION_STATE(GetHandler, SetHandler)\
  1430.     DEFINE_KSPROPERTY_ITEM(\
  1431.         KSPROPERTY_CONNECTION_STATE,\
  1432.         (GetHandler),\
  1433.         sizeof(KSPROPERTY),\
  1434.         sizeof(KSSTATE),\
  1435.         (SetHandler),\
  1436.         NULL, 0, NULL, NULL, 0)
  1437.  
  1438. #define DEFINE_KSPROPERTY_ITEM_CONNECTION_PRIORITY(GetHandler, SetHandler)\
  1439.     DEFINE_KSPROPERTY_ITEM(\
  1440.         KSPROPERTY_CONNECTION_PRIORITY,\
  1441.         (GetHandler),\
  1442.         sizeof(KSPROPERTY),\
  1443.         sizeof(KSPRIORITY),\
  1444.         (SetHandler),\
  1445.         NULL, 0, NULL, NULL, 0)
  1446.  
  1447. #define DEFINE_KSPROPERTY_ITEM_CONNECTION_DATAFORMAT(GetHandler, SetHandler)\
  1448.     DEFINE_KSPROPERTY_ITEM(\
  1449.         KSPROPERTY_CONNECTION_DATAFORMAT,\
  1450.         (GetHandler),\
  1451.         sizeof(KSPROPERTY),\
  1452.         0,\
  1453.         (SetHandler),\
  1454.         NULL, 0, NULL, NULL, 0)
  1455.  
  1456. #define DEFINE_KSPROPERTY_ITEM_CONNECTION_ALLOCATORFRAMING(Handler)\
  1457.     DEFINE_KSPROPERTY_ITEM(\
  1458.         KSPROPERTY_CONNECTION_ALLOCATORFRAMING,\
  1459.         (Handler),\
  1460.         sizeof(KSPROPERTY),\
  1461.         sizeof(KSALLOCATOR_FRAMING),\
  1462.         NULL, NULL, 0, NULL, NULL, 0)
  1463.         
  1464. #define DEFINE_KSPROPERTY_ITEM_CONNECTION_ALLOCATORFRAMING_EX(Handler)\
  1465.     DEFINE_KSPROPERTY_ITEM(\
  1466.         KSPROPERTY_CONNECTION_ALLOCATORFRAMING_EX,\
  1467.         (Handler),\
  1468.         sizeof(KSPROPERTY),\
  1469.         sizeof(KSALLOCATOR_FRAMING_EX),\
  1470.         NULL, NULL, 0, NULL, NULL, 0)
  1471.  
  1472. #define DEFINE_KSPROPERTY_ITEM_CONNECTION_PROPOSEDATAFORMAT(Handler)\
  1473.     DEFINE_KSPROPERTY_ITEM(\
  1474.         KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT,\
  1475.         NULL,\
  1476.         sizeof(KSPROPERTY),\
  1477.         sizeof(KSDATAFORMAT),\
  1478.         (Handler),\
  1479.         NULL, 0, NULL, NULL, 0)
  1480.  
  1481. #define DEFINE_KSPROPERTY_ITEM_CONNECTION_ACQUIREORDERING(Handler)\
  1482.     DEFINE_KSPROPERTY_ITEM(\
  1483.         KSPROPERTY_CONNECTION_ACQUIREORDERING,\
  1484.         (Handler),\
  1485.         sizeof(KSPROPERTY),\
  1486.         sizeof(int),\
  1487.         NULL, NULL, 0, NULL, NULL, 0)
  1488.  
  1489. #define DEFINE_KSPROPERTY_ITEM_CONNECTION_STARTAT(Handler)\
  1490.     DEFINE_KSPROPERTY_ITEM(\
  1491.         KSPROPERTY_CONNECTION_STARTAT,\
  1492.         NULL,\
  1493.         sizeof(KSPROPERTY),\
  1494.         sizeof(KSRELATIVEEVENT),\
  1495.         (Handler),\
  1496.         NULL, 0, NULL, NULL, 0)
  1497.  
  1498. //===========================================================================
  1499. //
  1500. // pins flags
  1501. //
  1502. #define KSALLOCATOR_REQUIREMENTF_INPLACE_MODIFIER   0x00000001
  1503. #define KSALLOCATOR_REQUIREMENTF_SYSTEM_MEMORY      0x00000002
  1504. #define KSALLOCATOR_REQUIREMENTF_FRAME_INTEGRITY    0x00000004
  1505. #define KSALLOCATOR_REQUIREMENTF_MUST_ALLOCATE      0x00000008
  1506. #define KSALLOCATOR_REQUIREMENTF_PREFERENCES_ONLY   0x80000000
  1507.  
  1508. #define KSALLOCATOR_OPTIONF_COMPATIBLE              0x00000001
  1509. #define KSALLOCATOR_OPTIONF_SYSTEM_MEMORY           0x00000002
  1510. #define KSALLOCATOR_OPTIONF_VALID                   0x00000003
  1511. // 
  1512. // pins extended framing flags
  1513. //
  1514. #define KSALLOCATOR_FLAG_PARTIAL_READ_SUPPORT       0x00000010
  1515. #define KSALLOCATOR_FLAG_DEVICE_SPECIFIC            0x00000020
  1516. #define KSALLOCATOR_FLAG_CAN_ALLOCATE               0x00000040
  1517. #define KSALLOCATOR_FLAG_INSIST_ON_FRAMESIZE_RATIO  0x00000080
  1518. //
  1519. // allocator pipes flags
  1520. //
  1521. // there is at least one data modification in a pipe
  1522. #define KSALLOCATOR_FLAG_NO_FRAME_INTEGRITY         0x00000100
  1523. #define KSALLOCATOR_FLAG_MULTIPLE_OUTPUT            0x00000200
  1524. #define KSALLOCATOR_FLAG_CYCLE                      0x00000400
  1525. #define KSALLOCATOR_FLAG_ALLOCATOR_EXISTS           0x00000800
  1526. // there is no framing dependency between neighbouring pipes.
  1527. #define KSALLOCATOR_FLAG_INDEPENDENT_RANGES         0x00001000
  1528. #define KSALLOCATOR_FLAG_ATTENTION_STEPPING         0x00002000
  1529.  
  1530.  
  1531. //
  1532. // old Framing structure
  1533. //
  1534. typedef struct {
  1535.     union {
  1536.         ULONG       OptionsFlags;       // allocator options (create)
  1537.         ULONG       RequirementsFlags;  // allocation requirements (query)
  1538.     };
  1539. #if defined(_NTDDK_)
  1540.     POOL_TYPE   PoolType;
  1541. #else // !_NTDDK_
  1542.     ULONG       PoolType;
  1543. #endif // !_NTDDK_
  1544.     ULONG       Frames;     // total number of allowable outstanding frames
  1545.     ULONG       FrameSize;  // total size of frame
  1546.     ULONG       FileAlignment;
  1547.     ULONG       Reserved;
  1548. } KSALLOCATOR_FRAMING, *PKSALLOCATOR_FRAMING;
  1549.  
  1550. #if defined(_NTDDK_)
  1551. typedef
  1552. PVOID
  1553. (*PFNKSDEFAULTALLOCATE)(
  1554.     IN PVOID Context
  1555.     );
  1556.  
  1557. typedef
  1558. VOID
  1559. (*PFNKSDEFAULTFREE)(
  1560.     IN PVOID Context,
  1561.     IN PVOID Buffer
  1562.     );
  1563.  
  1564. typedef
  1565. NTSTATUS
  1566. (*PFNKSINITIALIZEALLOCATOR)(
  1567.     IN PVOID InitialContext,
  1568.     IN PKSALLOCATOR_FRAMING AllocatorFraming,
  1569.     OUT PVOID* Context
  1570.     );
  1571.  
  1572. typedef
  1573. VOID
  1574. (*PFNKSDELETEALLOCATOR)(
  1575.     IN PVOID Context
  1576.     );
  1577. #endif // !_NTDDK_
  1578.  
  1579. //
  1580. // new Framing structure, eventually will replace KSALLOCATOR_FRAMING.
  1581. // 
  1582. typedef struct {
  1583.     ULONG   MinFrameSize;
  1584.     ULONG   MaxFrameSize;
  1585.     ULONG   Stepping;
  1586. } KS_FRAMING_RANGE, *PKS_FRAMING_RANGE;
  1587.  
  1588.  
  1589. typedef struct {
  1590.     KS_FRAMING_RANGE  Range;
  1591.     ULONG             InPlaceWeight;
  1592.     ULONG             NotInPlaceWeight;
  1593. } KS_FRAMING_RANGE_WEIGHTED, *PKS_FRAMING_RANGE_WEIGHTED;
  1594.  
  1595.  
  1596. typedef struct {
  1597.     ULONG   RatioNumerator;      // compression/expansion ratio
  1598.     ULONG   RatioDenominator; 
  1599.     ULONG   RatioConstantMargin;
  1600. } KS_COMPRESSION, *PKS_COMPRESSION;
  1601.  
  1602.  
  1603. //
  1604. // Memory Types and Buses are repeated in each entry.
  1605. // Easiest to use but takes a little more memory than the varsize layout Pin\Memories\Buses\Ranges.
  1606. //
  1607. typedef struct {
  1608.     GUID                        MemoryType;
  1609.     GUID                        BusType;
  1610.     ULONG                       MemoryFlags;
  1611.     ULONG                       BusFlags;   
  1612.     ULONG                       Flags;   
  1613.     ULONG                       Frames;              // total number of allowable outstanding frames
  1614.     ULONG                       FileAlignment;
  1615.     ULONG                       MemoryTypeWeight;    // this memory type Weight pin-wide
  1616.     KS_FRAMING_RANGE            PhysicalRange;
  1617.     KS_FRAMING_RANGE_WEIGHTED   FramingRange; 
  1618. } KS_FRAMING_ITEM, *PKS_FRAMING_ITEM;
  1619.  
  1620.  
  1621. typedef struct {
  1622.     ULONG               CountItems;         // count of FramingItem-s below.
  1623.     ULONG               PinFlags;
  1624.     KS_COMPRESSION      OutputCompression;
  1625.     ULONG               PinWeight;          // this pin framing's Weight graph-wide
  1626.     KS_FRAMING_ITEM     FramingItem[1]; 
  1627. } KSALLOCATOR_FRAMING_EX, *PKSALLOCATOR_FRAMING_EX;
  1628.  
  1629.  
  1630.  
  1631. //
  1632. // define memory type GUIDs
  1633. //
  1634. #define KSMEMORY_TYPE_WILDCARD          GUID_NULL
  1635. #define STATIC_KSMEMORY_TYPE_WILDCARD   STATIC_GUID_NULL
  1636.  
  1637. #define KSMEMORY_TYPE_DONT_CARE         GUID_NULL
  1638. #define STATIC_KSMEMORY_TYPE_DONT_CARE  STATIC_GUID_NULL
  1639.  
  1640. #define KS_TYPE_DONT_CARE           GUID_NULL
  1641. #define STATIC_KS_TYPE_DONT_CARE    STATIC_GUID_NULL
  1642.      
  1643. #define STATIC_KSMEMORY_TYPE_SYSTEM \
  1644.     0x091bb638L, 0x603f, 0x11d1, 0xb0, 0x67, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02
  1645. DEFINE_GUIDSTRUCT("091bb638-603f-11d1-b067-00a0c9062802", KSMEMORY_TYPE_SYSTEM);
  1646. #define KSMEMORY_TYPE_SYSTEM  DEFINE_GUIDNAMED(KSMEMORY_TYPE_SYSTEM)
  1647.  
  1648. #define STATIC_KSMEMORY_TYPE_USER \
  1649.     0x8cb0fc28L, 0x7893, 0x11d1, 0xb0, 0x69, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02
  1650. DEFINE_GUIDSTRUCT("8cb0fc28-7893-11d1-b069-00a0c9062802", KSMEMORY_TYPE_USER);
  1651. #define KSMEMORY_TYPE_USER  DEFINE_GUIDNAMED(KSMEMORY_TYPE_USER)
  1652.  
  1653. #define STATIC_KSMEMORY_TYPE_KERNEL_PAGED \
  1654.     0xd833f8f8L, 0x7894, 0x11d1, 0xb0, 0x69, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02
  1655. DEFINE_GUIDSTRUCT("d833f8f8-7894-11d1-b069-00a0c9062802", KSMEMORY_TYPE_KERNEL_PAGED);
  1656. #define KSMEMORY_TYPE_KERNEL_PAGED  DEFINE_GUIDNAMED(KSMEMORY_TYPE_KERNEL_PAGED)
  1657.  
  1658. #define STATIC_KSMEMORY_TYPE_KERNEL_NONPAGED \
  1659.     0x4a6d5fc4L, 0x7895, 0x11d1, 0xb0, 0x69, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02
  1660. DEFINE_GUIDSTRUCT("4a6d5fc4-7895-11d1-b069-00a0c9062802", KSMEMORY_TYPE_KERNEL_NONPAGED);
  1661. #define KSMEMORY_TYPE_KERNEL_NONPAGED  DEFINE_GUIDNAMED(KSMEMORY_TYPE_KERNEL_NONPAGED)
  1662.  
  1663. // old KS clients did not specify the device memory type
  1664. #define STATIC_KSMEMORY_TYPE_DEVICE_UNKNOWN \
  1665.     0x091bb639L, 0x603f, 0x11d1, 0xb0, 0x67, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02
  1666. DEFINE_GUIDSTRUCT("091bb639-603f-11d1-b067-00a0c9062802", KSMEMORY_TYPE_DEVICE_UNKNOWN);
  1667. #define KSMEMORY_TYPE_DEVICE_UNKNOWN DEFINE_GUIDNAMED(KSMEMORY_TYPE_DEVICE_UNKNOWN)
  1668.  
  1669. //
  1670. // Helper framing macros.
  1671. //
  1672. #define DECLARE_SIMPLE_FRAMING_EX(FramingExName, MemoryType, Flags, Frames, Alignment, MinFrameSize, MaxFrameSize) \
  1673.     const KSALLOCATOR_FRAMING_EX FramingExName = \
  1674.     {\
  1675.         1, \
  1676.         0, \
  1677.         {\
  1678.             1, \
  1679.             1, \
  1680.             0 \
  1681.         }, \
  1682.         0, \
  1683.         {\
  1684.             {\
  1685.                 MemoryType, \
  1686.                 STATIC_KS_TYPE_DONT_CARE, \
  1687.                 0, \
  1688.                 0, \
  1689.                 Flags, \
  1690.                 Frames, \
  1691.                 Alignment, \
  1692.                 0, \
  1693.                 {\
  1694.                     0, \
  1695.                     (ULONG)-1, \
  1696.                     1 \
  1697.                 }, \
  1698.                 {\
  1699.                     {\
  1700.                         MinFrameSize, \
  1701.                         MaxFrameSize, \
  1702.                         1 \
  1703.                     }, \
  1704.                     0, \
  1705.                     0  \
  1706.                 }\
  1707.             }\
  1708.         }\
  1709.     }
  1710.  
  1711. #define SetDefaultKsCompression(KsCompressionPointer) \
  1712. {\
  1713.     KsCompressionPointer->RatioNumerator = 1;\
  1714.     KsCompressionPointer->RatioDenominator = 1;\
  1715.     KsCompressionPointer->RatioConstantMargin = 0;\
  1716. }
  1717.  
  1718. #define SetDontCareKsFramingRange(KsFramingRangePointer) \
  1719. {\
  1720.     KsFramingRangePointer->MinFrameSize = 0;\
  1721.     KsFramingRangePointer->MaxFrameSize = (ULONG) -1;\
  1722.     KsFramingRangePointer->Stepping = 1;\
  1723. }
  1724.  
  1725. #define SetKsFramingRange(KsFramingRangePointer, P_MinFrameSize, P_MaxFrameSize) \
  1726. {\
  1727.     KsFramingRangePointer->MinFrameSize = P_MinFrameSize;\
  1728.     KsFramingRangePointer->MaxFrameSize = P_MaxFrameSize;\
  1729.     KsFramingRangePointer->Stepping = 1;\
  1730. }
  1731.  
  1732. #define SetKsFramingRangeWeighted(KsFramingRangeWeightedPointer, P_MinFrameSize, P_MaxFrameSize) \
  1733. {\
  1734.     KS_FRAMING_RANGE *KsFramingRange = &KsFramingRangeWeightedPointer->Range;\
  1735.     SetKsFramingRange(KsFramingRange, P_MinFrameSize, P_MaxFrameSize);\
  1736.     KsFramingRangeWeightedPointer->InPlaceWeight = 0;\
  1737.     KsFramingRangeWeightedPointer->NotInPlaceWeight = 0;\
  1738. }
  1739.  
  1740. #define INITIALIZE_SIMPLE_FRAMING_EX(FramingExPointer, P_MemoryType, P_Flags, P_Frames, P_Alignment, P_MinFrameSize, P_MaxFrameSize) \
  1741. {\
  1742.     KS_COMPRESSION *KsCompression = &FramingExPointer->OutputCompression;\
  1743.     KS_FRAMING_RANGE *KsFramingRange = &FramingExPointer->FramingItem[0].PhysicalRange;\
  1744.     KS_FRAMING_RANGE_WEIGHTED *KsFramingRangeWeighted = &FramingExPointer->FramingItem[0].FramingRange;\
  1745.     FramingExPointer->CountItems = 1;\
  1746.     FramingExPointer->PinFlags = 0;\
  1747.     SetDefaultKsCompression(KsCompression);\
  1748.     FramingExPointer->PinWeight = 0;\
  1749.     FramingExPointer->FramingItem[0].MemoryType = P_MemoryType;\
  1750.     FramingExPointer->FramingItem[0].BusType = KS_TYPE_DONT_CARE;\
  1751.     FramingExPointer->FramingItem[0].MemoryFlags = 0;\
  1752.     FramingExPointer->FramingItem[0].BusFlags = 0;\
  1753.     FramingExPointer->FramingItem[0].Flags = P_Flags;\
  1754.     FramingExPointer->FramingItem[0].Frames = P_Frames;\
  1755.     FramingExPointer->FramingItem[0].FileAlignment = P_Alignment;\
  1756.     FramingExPointer->FramingItem[0].MemoryTypeWeight = 0;\
  1757.     SetDontCareKsFramingRange(KsFramingRange);\
  1758.     SetKsFramingRangeWeighted(KsFramingRangeWeighted, P_MinFrameSize, P_MaxFrameSize);\
  1759. }
  1760.  
  1761.  
  1762.  
  1763. // KSEVENTSETID_StreamAllocator: {75D95571-073C-11d0-A161-0020AFD156E4}
  1764.  
  1765. #define STATIC_KSEVENTSETID_StreamAllocator\
  1766.     0x75d95571L, 0x073c, 0x11d0, 0xa1, 0x61, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
  1767. DEFINE_GUIDSTRUCT("75d95571-073c-11d0-a161-0020afd156e4", KSEVENTSETID_StreamAllocator);
  1768. #define KSEVENTSETID_StreamAllocator DEFINE_GUIDNAMED(KSEVENTSETID_StreamAllocator)
  1769.  
  1770. typedef enum {
  1771.     KSEVENT_STREAMALLOCATOR_INTERNAL_FREEFRAME,
  1772.     KSEVENT_STREAMALLOCATOR_FREEFRAME
  1773. } KSEVENT_STREAMALLOCATOR;
  1774.  
  1775. #define STATIC_KSMETHODSETID_StreamAllocator\
  1776.     0xcf6e4341L, 0xec87, 0x11cf, 0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
  1777. DEFINE_GUIDSTRUCT("cf6e4341-ec87-11cf-a130-0020afd156e4", KSMETHODSETID_StreamAllocator);
  1778. #define KSMETHODSETID_StreamAllocator DEFINE_GUIDNAMED(KSMETHODSETID_StreamAllocator)
  1779.  
  1780. typedef enum {
  1781.     KSMETHOD_STREAMALLOCATOR_ALLOC,
  1782.     KSMETHOD_STREAMALLOCATOR_FREE
  1783. } KSMETHOD_STREAMALLOCATOR;
  1784.  
  1785. #define DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_ALLOC(Handler)\
  1786.     DEFINE_KSMETHOD_ITEM(\
  1787.         KSMETHOD_STREAMALLOCATOR_ALLOC,\
  1788.         KSMETHOD_TYPE_WRITE,\
  1789.         (Handler),\
  1790.         sizeof(KSMETHOD),\
  1791.         sizeof(PVOID),\
  1792.         NULL)
  1793.  
  1794. #define DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_FREE(Handler)\
  1795.     DEFINE_KSMETHOD_ITEM(\
  1796.         KSMETHOD_STREAMALLOCATOR_FREE,\
  1797.         KSMETHOD_TYPE_READ,\
  1798.         (Handler),\
  1799.         sizeof(KSMETHOD),\
  1800.         sizeof(PVOID),\
  1801.         NULL)
  1802.  
  1803. #define DEFINE_KSMETHOD_ALLOCATORSET(AllocatorSet, MethodAlloc, MethodFree)\
  1804. DEFINE_KSMETHOD_TABLE(AllocatorSet) {\
  1805.     DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_ALLOC(MethodAlloc),\
  1806.     DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_FREE(MethodFree)\
  1807. }
  1808.  
  1809. #define STATIC_KSPROPSETID_StreamAllocator\
  1810.     0xcf6e4342L, 0xec87, 0x11cf, 0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
  1811. DEFINE_GUIDSTRUCT("cf6e4342-ec87-11cf-a130-0020afd156e4", KSPROPSETID_StreamAllocator);
  1812. #define KSPROPSETID_StreamAllocator DEFINE_GUIDNAMED(KSPROPSETID_StreamAllocator)
  1813.  
  1814. #if defined(_NTDDK_)
  1815. typedef enum {
  1816.     KSPROPERTY_STREAMALLOCATOR_FUNCTIONTABLE,
  1817.     KSPROPERTY_STREAMALLOCATOR_STATUS
  1818. } KSPROPERTY_STREAMALLOCATOR;
  1819.  
  1820. #define DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_FUNCTIONTABLE(Handler)\
  1821.     DEFINE_KSPROPERTY_ITEM(\
  1822.         KSPROPERTY_STREAMALLOCATOR_FUNCTIONTABLE,\
  1823.         (Handler),\
  1824.         sizeof(KSPROPERTY),\
  1825.         sizeof(KSSTREAMALLOCATOR_FUNCTIONTABLE),\
  1826.         NULL, NULL, 0, NULL, NULL, 0)
  1827.         
  1828. #define DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_STATUS(Handler)\
  1829.     DEFINE_KSPROPERTY_ITEM(\
  1830.         KSPROPERTY_STREAMALLOCATOR_STATUS,\
  1831.         (Handler),\
  1832.         sizeof(KSPROPERTY),\
  1833.         sizeof(KSSTREAMALLOCATOR_STATUS),\
  1834.         NULL, NULL, 0, NULL, NULL, 0)
  1835.  
  1836. #define DEFINE_KSPROPERTY_ALLOCATORSET(AllocatorSet, PropFunctionTable, PropStatus)\
  1837. DEFINE_KSPROPERTY_TABLE(AllocatorSet) {\
  1838.     DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_STATUS(PropStatus),\
  1839.     DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_FUNCTIONTABLE(PropFunctionTable)\
  1840. }
  1841.  
  1842. typedef
  1843. NTSTATUS
  1844. (*PFNALLOCATOR_ALLOCATEFRAME)(
  1845.     IN PFILE_OBJECT FileObject,
  1846.     PVOID *Frame
  1847.     );
  1848.  
  1849. typedef
  1850. VOID
  1851. (*PFNALLOCATOR_FREEFRAME)(
  1852.     IN PFILE_OBJECT FileObject,
  1853.     IN PVOID Frame
  1854.     );
  1855.  
  1856. typedef struct {
  1857.     PFNALLOCATOR_ALLOCATEFRAME  AllocateFrame;
  1858.     PFNALLOCATOR_FREEFRAME      FreeFrame;
  1859. } KSSTREAMALLOCATOR_FUNCTIONTABLE, *PKSSTREAMALLOCATOR_FUNCTIONTABLE;
  1860. #endif // defined(_NTDDK_)
  1861.  
  1862. typedef struct {
  1863.     KSALLOCATOR_FRAMING Framing;
  1864.     ULONG               AllocatedFrames;
  1865.     ULONG               Reserved;
  1866. } KSSTREAMALLOCATOR_STATUS, *PKSSTREAMALLOCATOR_STATUS;
  1867.  
  1868. typedef struct {
  1869.     KSALLOCATOR_FRAMING_EX Framing;
  1870.     ULONG                  AllocatedFrames;
  1871.     ULONG                  Reserved;
  1872. } KSSTREAMALLOCATOR_STATUS_EX, *PKSSTREAMALLOCATOR_STATUS_EX;
  1873.  
  1874.  
  1875. #define KSSTREAM_HEADER_OPTIONSF_SPLICEPOINT        0x00000001
  1876. #define KSSTREAM_HEADER_OPTIONSF_PREROLL            0x00000002
  1877. #define KSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY  0x00000004
  1878. #define KSSTREAM_HEADER_OPTIONSF_TYPECHANGED        0x00000008
  1879. #define KSSTREAM_HEADER_OPTIONSF_TIMEVALID          0x00000010
  1880. #define KSSTREAM_HEADER_OPTIONSF_TIMEDISCONTINUITY  0x00000040
  1881. #define KSSTREAM_HEADER_OPTIONSF_FLUSHONPAUSE       0x00000080
  1882. #define KSSTREAM_HEADER_OPTIONSF_DURATIONVALID      0x00000100
  1883. #define KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM        0x00000200
  1884. #define KSSTREAM_HEADER_OPTIONSF_LOOPEDDATA         0x80000000
  1885.  
  1886. typedef struct {
  1887.     LONGLONG    Time;
  1888.     ULONG       Numerator;
  1889.     ULONG       Denominator;
  1890. } KSTIME, *PKSTIME;
  1891.  
  1892. typedef struct {
  1893.     ULONG       Size;
  1894.     ULONG       TypeSpecificFlags;
  1895.     KSTIME      PresentationTime;
  1896.     LONGLONG    Duration;
  1897.     ULONG       FrameExtent;
  1898.     ULONG       DataUsed;
  1899.     PVOID       Data;
  1900.     ULONG       OptionsFlags;
  1901. #if _WIN64
  1902.     ULONG       Reserved;
  1903. #endif
  1904. } KSSTREAM_HEADER, *PKSSTREAM_HEADER;
  1905.  
  1906. #define STATIC_KSPROPSETID_StreamInterface\
  1907.     0x1fdd8ee1L, 0x9cd3, 0x11d0, 0x82, 0xaa, 0x00, 0x00, 0xf8, 0x22, 0xfe, 0x8a
  1908. DEFINE_GUIDSTRUCT("1fdd8ee1-9cd3-11d0-82aa-0000f822fe8a", KSPROPSETID_StreamInterface);
  1909. #define KSPROPSETID_StreamInterface DEFINE_GUIDNAMED(KSPROPSETID_StreamInterface)
  1910.  
  1911. typedef enum {
  1912.     KSPROPERTY_STREAMINTERFACE_HEADERSIZE
  1913. } KSPROPERTY_STREAMINTERFACE;
  1914.  
  1915. #define DEFINE_KSPROPERTY_ITEM_STREAMINTERFACE_HEADERSIZE( GetHandler )\
  1916.     DEFINE_KSPROPERTY_ITEM(\
  1917.         KSPROPERTY_STREAMINTERFACE_HEADERSIZE,\
  1918.         (GetHandler),\
  1919.         sizeof(KSPROPERTY),\
  1920.         sizeof(ULONG),\
  1921.         NULL, NULL, 0, NULL, NULL, 0)
  1922.         
  1923. #define DEFINE_KSPROPERTY_STREAMINTERFACESET(StreamInterfaceSet,\
  1924.     HeaderSizeHandler)\
  1925. DEFINE_KSPROPERTY_TABLE(StreamInterfaceSet) {\
  1926.     DEFINE_KSPROPERTY_ITEM_STREAMINTERFACE_HEADERSIZE( HeaderSizeHandler )\
  1927. }
  1928.  
  1929. #define STATIC_KSPROPSETID_Stream\
  1930.     0x65aaba60L, 0x98ae, 0x11cf, 0xa1, 0x0d, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
  1931. DEFINE_GUIDSTRUCT("65aaba60-98ae-11cf-a10d-0020afd156e4", KSPROPSETID_Stream);
  1932. #define KSPROPSETID_Stream DEFINE_GUIDNAMED(KSPROPSETID_Stream)
  1933.  
  1934. typedef enum {
  1935.     KSPROPERTY_STREAM_ALLOCATOR,
  1936.     KSPROPERTY_STREAM_QUALITY,
  1937.     KSPROPERTY_STREAM_DEGRADATION,
  1938.     KSPROPERTY_STREAM_MASTERCLOCK,
  1939.     KSPROPERTY_STREAM_TIMEFORMAT,
  1940.     KSPROPERTY_STREAM_PRESENTATIONTIME,
  1941.     KSPROPERTY_STREAM_PRESENTATIONEXTENT,
  1942.     KSPROPERTY_STREAM_FRAMETIME,
  1943.     KSPROPERTY_STREAM_RATECAPABILITY,
  1944.     KSPROPERTY_STREAM_RATE,
  1945.     KSPROPERTY_STREAM_PIPE_ID
  1946. } KSPROPERTY_STREAM;
  1947.  
  1948. #define DEFINE_KSPROPERTY_ITEM_STREAM_ALLOCATOR(GetHandler, SetHandler)\
  1949.     DEFINE_KSPROPERTY_ITEM(\
  1950.         KSPROPERTY_STREAM_ALLOCATOR,\
  1951.         (GetHandler),\
  1952.         sizeof(KSPROPERTY),\
  1953.         sizeof(HANDLE),\
  1954.         (SetHandler),\
  1955.         NULL, 0, NULL, NULL, 0)
  1956.  
  1957. #define DEFINE_KSPROPERTY_ITEM_STREAM_QUALITY(Handler)\
  1958.     DEFINE_KSPROPERTY_ITEM(\
  1959.         KSPROPERTY_STREAM_QUALITY,\
  1960.         (Handler),\
  1961.         sizeof(KSPROPERTY),\
  1962.         sizeof(KSQUALITY_MANAGER),\
  1963.         NULL, NULL, 0, NULL, NULL, 0)
  1964.  
  1965. #define DEFINE_KSPROPERTY_ITEM_STREAM_DEGRADATION(GetHandler, SetHandler)\
  1966.     DEFINE_KSPROPERTY_ITEM(\
  1967.         KSPROPERTY_STREAM_DEGRADATION,\
  1968.         (GetHandler),\
  1969.         sizeof(KSPROPERTY),\
  1970.         0,\
  1971.         (SetHandler),\
  1972.         NULL, 0, NULL, NULL, 0)
  1973.  
  1974. #define DEFINE_KSPROPERTY_ITEM_STREAM_MASTERCLOCK(GetHandler, SetHandler)\
  1975.     DEFINE_KSPROPERTY_ITEM(\
  1976.         KSPROPERTY_STREAM_MASTERCLOCK,\
  1977.         (GetHandler),\
  1978.         sizeof(KSPROPERTY),\
  1979.         sizeof(HANDLE),\
  1980.         (SetHandler),\
  1981.         NULL, 0, NULL, NULL, 0)
  1982.  
  1983. #define DEFINE_KSPROPERTY_ITEM_STREAM_TIMEFORMAT(Handler)\
  1984.     DEFINE_KSPROPERTY_ITEM(\
  1985.         KSPROPERTY_STREAM_TIMEFORMAT,\
  1986.         (Handler),\
  1987.         sizeof(KSPROPERTY),\
  1988.         sizeof(GUID),\
  1989.         NULL, NULL, 0, NULL, NULL, 0)
  1990.  
  1991. #define DEFINE_KSPROPERTY_ITEM_STREAM_PRESENTATIONTIME(GetHandler, SetHandler)\
  1992.     DEFINE_KSPROPERTY_ITEM(\
  1993.         KSPROPERTY_STREAM_PRESENTATIONTIME,\
  1994.         (GetHandler),\
  1995.         sizeof(KSPROPERTY),\
  1996.         sizeof(KSTIME),\
  1997.         (SetHandler),\
  1998.         NULL, 0, NULL, NULL, 0)
  1999.  
  2000. #define DEFINE_KSPROPERTY_ITEM_STREAM_PRESENTATIONEXTENT(Handler)\
  2001.     DEFINE_KSPROPERTY_ITEM(\
  2002.         KSPROPERTY_STREAM_PRESENTATIONEXTENT,\
  2003.         (Handler),\
  2004.         sizeof(KSPROPERTY),\
  2005.         sizeof(LONGLONG),\
  2006.         NULL, NULL, 0, NULL, NULL, 0)
  2007.  
  2008. #define DEFINE_KSPROPERTY_ITEM_STREAM_FRAMETIME(Handler)\
  2009.     DEFINE_KSPROPERTY_ITEM(\
  2010.         KSPROPERTY_STREAM_FRAMETIME,\
  2011.         (Handler),\
  2012.         sizeof(KSPROPERTY),\
  2013.         sizeof(KSFRAMETIME),\
  2014.         NULL, NULL, 0, NULL, NULL, 0)
  2015.  
  2016. #define DEFINE_KSPROPERTY_ITEM_STREAM_RATECAPABILITY(Handler)\
  2017.     DEFINE_KSPROPERTY_ITEM(\
  2018.         KSPROPERTY_STREAM_RATECAPABILITY,\
  2019.         (Handler),\
  2020.         sizeof(KSRATE_CAPABILITY),\
  2021.         sizeof(KSRATE),\
  2022.         NULL, NULL, 0, NULL, NULL, 0)
  2023.  
  2024. #define DEFINE_KSPROPERTY_ITEM_STREAM_RATE(GetHandler, SetHandler)\
  2025.     DEFINE_KSPROPERTY_ITEM(\
  2026.         KSPROPERTY_STREAM_RATE,\
  2027.         (GetHandler),\
  2028.         sizeof(KSPROPERTY),\
  2029.         sizeof(KSRATE),\
  2030.         (SetHandler),\
  2031.         NULL, 0, NULL, NULL, 0)
  2032.  
  2033. #define DEFINE_KSPROPERTY_ITEM_STREAM_PIPE_ID(GetHandler, SetHandler)\
  2034.     DEFINE_KSPROPERTY_ITEM(\
  2035.         KSPROPERTY_STREAM_PIPE_ID,\
  2036.         (GetHandler),\
  2037.         sizeof(KSPROPERTY),\
  2038.         sizeof(HANDLE),\
  2039.         (SetHandler),\
  2040.         NULL, 0, NULL, NULL, 0)
  2041.  
  2042. typedef struct {
  2043.     HANDLE      QualityManager;
  2044.     PVOID       Context;
  2045. } KSQUALITY_MANAGER, *PKSQUALITY_MANAGER;
  2046.  
  2047. typedef struct {
  2048.     LONGLONG    Duration;
  2049.     ULONG       FrameFlags;
  2050.     ULONG       Reserved;
  2051. } KSFRAMETIME, *PKSFRAMETIME;
  2052.  
  2053. #define KSFRAMETIME_VARIABLESIZE    0x00000001
  2054.  
  2055. typedef struct {
  2056.     LONGLONG        PresentationStart;
  2057.     LONGLONG        Duration;
  2058.     KSPIN_INTERFACE Interface;
  2059.     LONG            Rate;
  2060.     ULONG           Flags;
  2061. } KSRATE, *PKSRATE;
  2062.  
  2063. #define KSRATE_NOPRESENTATIONSTART      0x00000001
  2064. #define KSRATE_NOPRESENTATIONDURATION   0x00000002
  2065.  
  2066. typedef struct {
  2067.     KSPROPERTY      Property;
  2068.     KSRATE          Rate;
  2069. } KSRATE_CAPABILITY, *PKSRATE_CAPABILITY;
  2070.  
  2071. #define STATIC_KSPROPSETID_Clock \
  2072.     0xDF12A4C0L, 0xAC17, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  2073. DEFINE_GUIDSTRUCT("DF12A4C0-AC17-11CF-A5D6-28DB04C10000", KSPROPSETID_Clock);
  2074. #define KSPROPSETID_Clock DEFINE_GUIDNAMED(KSPROPSETID_Clock)
  2075.  
  2076. //
  2077. // Performs a x*y/z operation on 64 bit quantities by splitting the operation. The equation
  2078. // is simplified with respect to adding in the remainder for the upper 32 bits.
  2079. //
  2080. // (xh * 10000000 / Frequency) * 2^32 + ((((xh * 10000000) % Frequency) * 2^32 + (xl * 10000000)) / Frequency)
  2081. //
  2082. #define NANOSECONDS 10000000
  2083. #define KSCONVERT_PERFORMANCE_TIME(Frequency, PerformanceTime) \
  2084.     ((((ULONGLONG)(ULONG)(PerformanceTime).HighPart * NANOSECONDS / (Frequency)) << 32) + \
  2085.     ((((((ULONGLONG)(ULONG)(PerformanceTime).HighPart * NANOSECONDS) % (Frequency)) << 32) + \
  2086.     ((ULONGLONG)(PerformanceTime).LowPart * NANOSECONDS)) / (Frequency)))
  2087.  
  2088. typedef struct {
  2089.     ULONG       CreateFlags;
  2090. } KSCLOCK_CREATE, *PKSCLOCK_CREATE;
  2091.  
  2092. typedef struct {
  2093.     LONGLONG    Time;
  2094.     LONGLONG    SystemTime;
  2095. } KSCORRELATED_TIME, *PKSCORRELATED_TIME;
  2096.  
  2097. typedef struct {
  2098.     LONGLONG    Granularity;
  2099.     LONGLONG    Error;
  2100. } KSRESOLUTION, *PKSRESOLUTION;
  2101.  
  2102. typedef enum {
  2103.     KSPROPERTY_CLOCK_TIME,
  2104.     KSPROPERTY_CLOCK_PHYSICALTIME,
  2105.     KSPROPERTY_CLOCK_CORRELATEDTIME,
  2106.     KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME,
  2107.     KSPROPERTY_CLOCK_RESOLUTION,
  2108.     KSPROPERTY_CLOCK_STATE,
  2109. #if defined(_NTDDK_)
  2110.     KSPROPERTY_CLOCK_FUNCTIONTABLE
  2111. #endif // defined(_NTDDK_)
  2112. } KSPROPERTY_CLOCK;
  2113.  
  2114. #if defined(_NTDDK_)
  2115.  
  2116. typedef
  2117. LONGLONG
  2118. (FASTCALL *PFNKSCLOCK_GETTIME)(
  2119.     IN PFILE_OBJECT FileObject
  2120.     );
  2121. typedef
  2122. LONGLONG
  2123. (FASTCALL *PFNKSCLOCK_CORRELATEDTIME)(
  2124.     IN PFILE_OBJECT FileObject,
  2125.     OUT PLONGLONG SystemTime);
  2126.  
  2127. typedef struct {
  2128.     PFNKSCLOCK_GETTIME GetTime;
  2129.     PFNKSCLOCK_GETTIME GetPhysicalTime;
  2130.     PFNKSCLOCK_CORRELATEDTIME GetCorrelatedTime;
  2131.     PFNKSCLOCK_CORRELATEDTIME GetCorrelatedPhysicalTime;
  2132. } KSCLOCK_FUNCTIONTABLE, *PKSCLOCK_FUNCTIONTABLE;
  2133.  
  2134. typedef
  2135. BOOLEAN
  2136. (*PFNKSSETTIMER)(
  2137.     IN PVOID Context,
  2138.     IN PKTIMER Timer,
  2139.     IN LARGE_INTEGER DueTime,
  2140.     IN PKDPC Dpc
  2141.     );
  2142.  
  2143. typedef
  2144. BOOLEAN
  2145. (*PFNKSCANCELTIMER)(
  2146.     IN PVOID Context,
  2147.     IN PKTIMER Timer
  2148.     );
  2149.  
  2150. typedef
  2151. LONGLONG
  2152. (FASTCALL *PFNKSCORRELATEDTIME)(
  2153.     IN PVOID Context,
  2154.     OUT PLONGLONG SystemTime);
  2155.  
  2156. typedef PVOID   PKSDEFAULTCLOCK;
  2157.  
  2158. #define DEFINE_KSPROPERTY_ITEM_CLOCK_TIME(Handler)\
  2159.     DEFINE_KSPROPERTY_ITEM(\
  2160.         KSPROPERTY_CLOCK_TIME,\
  2161.         (Handler),\
  2162.         sizeof(KSPROPERTY),\
  2163.         sizeof(LONGLONG),\
  2164.         NULL, NULL, 0, NULL, NULL, 0)
  2165.  
  2166. #define DEFINE_KSPROPERTY_ITEM_CLOCK_PHYSICALTIME(Handler)\
  2167.     DEFINE_KSPROPERTY_ITEM(\
  2168.         KSPROPERTY_CLOCK_PHYSICALTIME,\
  2169.         (Handler),\
  2170.         sizeof(KSPROPERTY),\
  2171.         sizeof(LONGLONG),\
  2172.         NULL, NULL, 0, NULL, NULL, 0)
  2173.  
  2174. #define DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDTIME(Handler)\
  2175.     DEFINE_KSPROPERTY_ITEM(\
  2176.         KSPROPERTY_CLOCK_CORRELATEDTIME,\
  2177.         (Handler),\
  2178.         sizeof(KSPROPERTY),\
  2179.         sizeof(KSCORRELATED_TIME),\
  2180.         NULL, NULL, 0, NULL, NULL, 0)
  2181.  
  2182. #define DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDPHYSICALTIME(Handler)\
  2183.     DEFINE_KSPROPERTY_ITEM(\
  2184.         KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME,\
  2185.         (Handler),\
  2186.         sizeof(KSPROPERTY),\
  2187.         sizeof(KSCORRELATED_TIME),\
  2188.         NULL, NULL, 0, NULL, NULL, 0)
  2189.  
  2190. #define DEFINE_KSPROPERTY_ITEM_CLOCK_RESOLUTION(Handler)\
  2191.     DEFINE_KSPROPERTY_ITEM(\
  2192.         KSPROPERTY_CLOCK_RESOLUTION,\
  2193.         (Handler),\
  2194.         sizeof(KSPROPERTY),\
  2195.         sizeof(KSRESOLUTION),\
  2196.         NULL, NULL, 0, NULL, NULL, 0)
  2197.  
  2198. #define DEFINE_KSPROPERTY_ITEM_CLOCK_STATE(Handler)\
  2199.     DEFINE_KSPROPERTY_ITEM(\
  2200.         KSPROPERTY_CLOCK_STATE,\
  2201.         (Handler),\
  2202.         sizeof(KSPROPERTY),\
  2203.         sizeof(KSSTATE),\
  2204.         NULL, NULL, 0, NULL, NULL, 0)
  2205.  
  2206. #define DEFINE_KSPROPERTY_ITEM_CLOCK_FUNCTIONTABLE(Handler)\
  2207.     DEFINE_KSPROPERTY_ITEM(\
  2208.         KSPROPERTY_CLOCK_FUNCTIONTABLE,\
  2209.         (Handler),\
  2210.         sizeof(KSPROPERTY),\
  2211.         sizeof(KSCLOCK_FUNCTIONTABLE),\
  2212.         NULL, NULL, 0, NULL, NULL, 0)
  2213.  
  2214. #define DEFINE_KSPROPERTY_CLOCKSET(ClockSet,\
  2215.     PropTime, PropPhysicalTime,\
  2216.     PropCorrelatedTime, PropCorrelatedPhysicalTime,\
  2217.     PropResolution, PropState, PropFunctionTable)\
  2218. DEFINE_KSPROPERTY_TABLE(ClockSet) {\
  2219.     DEFINE_KSPROPERTY_ITEM_CLOCK_TIME(PropTime),\
  2220.     DEFINE_KSPROPERTY_ITEM_CLOCK_PHYSICALTIME(PropPhysicalTime),\
  2221.     DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDTIME(PropCorrelatedTime),\
  2222.     DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDPHYSICALTIME(PropCorrelatedPhysicalTime),\
  2223.     DEFINE_KSPROPERTY_ITEM_CLOCK_RESOLUTION(PropResolution),\
  2224.     DEFINE_KSPROPERTY_ITEM_CLOCK_STATE(PropState),\
  2225.     DEFINE_KSPROPERTY_ITEM_CLOCK_FUNCTIONTABLE(PropFunctionTable),\
  2226. }
  2227.  
  2228. #endif // defined(_NTDDK_)
  2229.  
  2230. #define STATIC_KSEVENTSETID_Clock \
  2231.     0x364D8E20L, 0x62C7, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  2232. DEFINE_GUIDSTRUCT("364D8E20-62C7-11CF-A5D6-28DB04C10000", KSEVENTSETID_Clock);
  2233. #define KSEVENTSETID_Clock DEFINE_GUIDNAMED(KSEVENTSETID_Clock)
  2234.  
  2235. typedef enum {
  2236.     KSEVENT_CLOCK_INTERVAL_MARK,
  2237.     KSEVENT_CLOCK_POSITION_MARK
  2238. } KSEVENT_CLOCK_POSITION;
  2239.  
  2240. #define STATIC_KSEVENTSETID_Connection\
  2241.     0x7f4bcbe0L, 0x9ea5, 0x11cf, 0xa5, 0xd6, 0x28, 0xdb, 0x04, 0xc1, 0x00, 0x00
  2242. DEFINE_GUIDSTRUCT("7f4bcbe0-9ea5-11cf-a5d6-28db04c10000", KSEVENTSETID_Connection);
  2243. #define KSEVENTSETID_Connection DEFINE_GUIDNAMED(KSEVENTSETID_Connection)
  2244.  
  2245. typedef enum {
  2246.     KSEVENT_CONNECTION_POSITIONUPDATE,
  2247.     KSEVENT_CONNECTION_DATADISCONTINUITY,
  2248.     KSEVENT_CONNECTION_TIMEDISCONTINUITY,
  2249.     KSEVENT_CONNECTION_PRIORITY,
  2250.     KSEVENT_CONNECTION_ENDOFSTREAM
  2251. } KSEVENT_CONNECTION;
  2252.  
  2253. typedef struct {
  2254.     PVOID       Context;
  2255.     ULONG       Proportion;
  2256.     LONGLONG    DeltaTime;
  2257. } KSQUALITY, *PKSQUALITY;
  2258.  
  2259. typedef struct {
  2260.     PVOID       Context;
  2261.     ULONG       Status;
  2262. } KSERROR, *PKSERROR;
  2263.  
  2264. typedef KSIDENTIFIER KSDEGRADE, *PKSDEGRADE;
  2265.  
  2266. #define STATIC_KSDEGRADESETID_Standard\
  2267.     0x9F564180L, 0x704C, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  2268. DEFINE_GUIDSTRUCT("9F564180-704C-11D0-A5D6-28DB04C10000", KSDEGRADESETID_Standard);
  2269. #define KSDEGRADESETID_Standard DEFINE_GUIDNAMED(KSDEGRADESETID_Standard)
  2270.  
  2271. typedef enum {
  2272.     KSDEGRADE_STANDARD_SAMPLE,
  2273.     KSDEGRADE_STANDARD_QUALITY,
  2274.     KSDEGRADE_STANDARD_COMPUTATION,
  2275.     KSDEGRADE_STANDARD_SKIP
  2276. } KSDEGRADE_STANDARD;
  2277.  
  2278. #if defined(_NTDDK_)
  2279.  
  2280. #define KSPROBE_STREAMREAD      0x00000000
  2281. #define KSPROBE_STREAMWRITE     0x00000001
  2282. #define KSPROBE_ALLOCATEMDL     0x00000010
  2283. #define KSPROBE_PROBEANDLOCK    0x00000020
  2284. #define KSPROBE_SYSTEMADDRESS   0x00000040
  2285. #define KSPROBE_MODIFY          0x00000200
  2286. #define KSPROBE_STREAMWRITEMODIFY (KSPROBE_MODIFY | KSPROBE_STREAMWRITE)
  2287. #define KSPROBE_ALLOWFORMATCHANGE   0x00000080
  2288.  
  2289. #define KSSTREAM_READ           KSPROBE_STREAMREAD
  2290. #define KSSTREAM_WRITE          KSPROBE_STREAMWRITE
  2291. #define KSSTREAM_PAGED_DATA     0x00000000
  2292. #define KSSTREAM_NONPAGED_DATA  0x00000100
  2293. #define KSSTREAM_SYNCHRONOUS    0x00001000
  2294. #define KSSTREAM_FAILUREEXCEPTION 0x00002000
  2295.  
  2296. typedef
  2297. NTSTATUS
  2298. (*PFNKSCONTEXT_DISPATCH)(
  2299.     IN PVOID Context,
  2300.     IN PIRP Irp
  2301.     );
  2302.  
  2303. typedef
  2304. NTSTATUS
  2305. (*PFNKSHANDLER)(
  2306.     IN PIRP Irp,
  2307.     IN PKSIDENTIFIER Request,
  2308.     IN OUT PVOID Data
  2309.     );
  2310.  
  2311. typedef
  2312. BOOLEAN
  2313. (*PFNKSFASTHANDLER)(
  2314.     IN PFILE_OBJECT FileObject,
  2315.     IN PKSIDENTIFIER Request,
  2316.     IN ULONG RequestLength,
  2317.     IN OUT PVOID Data,
  2318.     IN ULONG DataLength,
  2319.     OUT PIO_STATUS_BLOCK IoStatus
  2320.     );
  2321.  
  2322. typedef
  2323. NTSTATUS
  2324. (*PFNKSALLOCATOR)(
  2325.     IN PIRP Irp,
  2326.     IN ULONG BufferSize,
  2327.     IN BOOLEAN InputOperation
  2328.     );
  2329.  
  2330. typedef struct {
  2331.     KSPROPERTY_MEMBERSHEADER    MembersHeader;
  2332.     const VOID*                 Members;
  2333. } KSPROPERTY_MEMBERSLIST, *PKSPROPERTY_MEMBERSLIST;
  2334.  
  2335. typedef struct {
  2336.     KSIDENTIFIER                    PropTypeSet;
  2337.     ULONG                           MembersListCount;
  2338.     const KSPROPERTY_MEMBERSLIST*   MembersList;
  2339. } KSPROPERTY_VALUES, *PKSPROPERTY_VALUES;
  2340.  
  2341. #define DEFINE_KSPROPERTY_TABLE(tablename)\
  2342.     const KSPROPERTY_ITEM tablename[] =
  2343.  
  2344. #define DEFINE_KSPROPERTY_ITEM(PropertyId, GetHandler,\
  2345.                                MinProperty,\
  2346.                                MinData,\
  2347.                                SetHandler,\
  2348.                                Values, RelationsCount, Relations, SupportHandler,\
  2349.                                SerializedSize)\
  2350. {\
  2351.     PropertyId, (PFNKSHANDLER)GetHandler, MinProperty, MinData,\
  2352.     (PFNKSHANDLER)SetHandler,\
  2353.     (PKSPROPERTY_VALUES)Values, RelationsCount, (PKSPROPERTY)Relations,\
  2354.     (PFNKSHANDLER)SupportHandler, (ULONG)SerializedSize\
  2355. }
  2356.  
  2357. typedef struct {
  2358.     ULONG                   PropertyId;
  2359.     union {
  2360.         PFNKSHANDLER            GetPropertyHandler;
  2361.         BOOLEAN                 GetSupported;
  2362.     };
  2363.     ULONG                   MinProperty;
  2364.     ULONG                   MinData;
  2365.     union {
  2366.         PFNKSHANDLER            SetPropertyHandler;
  2367.         BOOLEAN                 SetSupported;
  2368.     };
  2369.     const KSPROPERTY_VALUES*Values;
  2370.     ULONG                   RelationsCount;
  2371.     const KSPROPERTY*       Relations;
  2372.     PFNKSHANDLER            SupportHandler;
  2373.     ULONG                   SerializedSize;
  2374. } KSPROPERTY_ITEM, *PKSPROPERTY_ITEM;
  2375.  
  2376. #define DEFINE_KSFASTPROPERTY_ITEM(PropertyId, GetHandler, SetHandler)\
  2377. {\
  2378.     PropertyId, (PFNKSFASTHANDLER)GetHandler, (PFNKSFASTHANDLER)SetHandler, 0\
  2379. }
  2380.  
  2381. typedef struct {
  2382.     ULONG                       PropertyId;
  2383.     union {
  2384.         PFNKSFASTHANDLER            GetPropertyHandler;
  2385.         BOOLEAN                     GetSupported;
  2386.     };
  2387.     union {
  2388.         PFNKSFASTHANDLER            SetPropertyHandler;
  2389.         BOOLEAN                     SetSupported;
  2390.     };
  2391.     ULONG                       Reserved;
  2392. } KSFASTPROPERTY_ITEM, *PKSFASTPROPERTY_ITEM;
  2393.  
  2394. #define DEFINE_KSPROPERTY_SET(Set,\
  2395.                               PropertiesCount,\
  2396.                               PropertyItem,\
  2397.                               FastIoCount,\
  2398.                               FastIoTable)\
  2399. {\
  2400.     Set,\
  2401.     PropertiesCount,\
  2402.     PropertyItem,\
  2403.     FastIoCount,\
  2404.     FastIoTable\
  2405. }
  2406.  
  2407. #define DEFINE_KSPROPERTY_SET_TABLE(tablename)\
  2408.     const KSPROPERTY_SET tablename[] =
  2409.  
  2410. typedef struct {
  2411.     const GUID*                 Set;
  2412.     ULONG                       PropertiesCount;
  2413.     const KSPROPERTY_ITEM*      PropertyItem;
  2414.     ULONG                       FastIoCount;
  2415.     const KSFASTPROPERTY_ITEM*  FastIoTable;
  2416. } KSPROPERTY_SET, *PKSPROPERTY_SET;
  2417.  
  2418. #define DEFINE_KSMETHOD_TABLE(tablename)\
  2419.     const KSMETHOD_ITEM tablename[] =
  2420.  
  2421. #define DEFINE_KSMETHOD_ITEM(MethodId, Flags,\
  2422.                              MethodHandler,\
  2423.                              MinMethod, MinData, SupportHandler)\
  2424. {\
  2425.     MethodId, (PFNKSHANDLER)MethodHandler, MinMethod, MinData,\
  2426.     SupportHandler, Flags\
  2427. }
  2428.  
  2429. typedef struct {
  2430.     ULONG                   MethodId;
  2431.     union {
  2432.         PFNKSHANDLER            MethodHandler;
  2433.         BOOLEAN                 MethodSupported;
  2434.     };
  2435.     ULONG                   MinMethod;
  2436.     ULONG                   MinData;
  2437.     PFNKSHANDLER            SupportHandler;
  2438.     ULONG                   Flags;
  2439. } KSMETHOD_ITEM, *PKSMETHOD_ITEM;
  2440.  
  2441. #define DEFINE_KSFASTMETHOD_ITEM(MethodId, MethodHandler)\
  2442. {\
  2443.     MethodId, (PFNKSFASTHANDLER)MethodHandler\
  2444. }
  2445.  
  2446. typedef struct {
  2447.     ULONG                   MethodId;
  2448.     union {
  2449.         PFNKSFASTHANDLER        MethodHandler;
  2450.         BOOLEAN                 MethodSupported;
  2451.     };
  2452. } KSFASTMETHOD_ITEM, *PKSFASTMETHOD_ITEM;
  2453.  
  2454. #define DEFINE_KSMETHOD_SET(Set,\
  2455.                             MethodsCount,\
  2456.                             MethodItem,\
  2457.                             FastIoCount,\
  2458.                             FastIoTable)\
  2459. {\
  2460.     Set,\
  2461.     MethodsCount,\
  2462.     MethodItem,\
  2463.     FastIoCount,\
  2464.     FastIoTable\
  2465. }
  2466.  
  2467. #define DEFINE_KSMETHOD_SET_TABLE(tablename)\
  2468.     const KSMETHOD_SET tablename[] =
  2469.  
  2470. typedef struct {
  2471.     const GUID*             Set;
  2472.     ULONG                   MethodsCount;
  2473.     const KSMETHOD_ITEM*    MethodItem;
  2474.     ULONG                   FastIoCount;
  2475.     const KSFASTMETHOD_ITEM*FastIoTable;
  2476. } KSMETHOD_SET, *PKSMETHOD_SET;
  2477.  
  2478. typedef struct _KSEVENT_ENTRY
  2479. KSEVENT_ENTRY, *PKSEVENT_ENTRY;
  2480.  
  2481. typedef
  2482. NTSTATUS
  2483. (*PFNKSADDEVENT)(
  2484.     IN PIRP Irp,
  2485.     IN PKSEVENTDATA EventData,
  2486.     IN struct _KSEVENT_ENTRY* EventEntry
  2487.     );
  2488.  
  2489. typedef
  2490. VOID
  2491. (*PFNKSREMOVEEVENT)(
  2492.     IN PFILE_OBJECT FileObject,
  2493.     IN struct _KSEVENT_ENTRY* EventEntry
  2494.     );
  2495.     
  2496. #define DEFINE_KSEVENT_TABLE(tablename)\
  2497.     const KSEVENT_ITEM tablename[] =
  2498.  
  2499. #define DEFINE_KSEVENT_ITEM(EventId, DataInput, ExtraEntryData,\
  2500.                             AddHandler, RemoveHandler, SupportHandler)\
  2501. {\
  2502.     EventId,\
  2503.     DataInput,\
  2504.     ExtraEntryData,\
  2505.     AddHandler,\
  2506.     RemoveHandler,\
  2507.     SupportHandler\
  2508. }
  2509.  
  2510. typedef struct {
  2511.     ULONG               EventId;
  2512.     ULONG               DataInput;
  2513.     ULONG               ExtraEntryData;
  2514.     PFNKSADDEVENT       AddHandler;
  2515.     PFNKSREMOVEEVENT    RemoveHandler;
  2516.     PFNKSHANDLER        SupportHandler;
  2517. } KSEVENT_ITEM, *PKSEVENT_ITEM;
  2518.  
  2519. #define DEFINE_KSEVENT_SET(Set,\
  2520.                            EventsCount,\
  2521.                            EventItem)\
  2522. {\
  2523.     Set, EventsCount, EventItem\
  2524. }
  2525.  
  2526. #define DEFINE_KSEVENT_SET_TABLE(tablename)\
  2527.     const KSEVENT_SET tablename[] =
  2528.  
  2529. typedef struct {
  2530.     const GUID*         Set;
  2531.     ULONG               EventsCount;
  2532.     const KSEVENT_ITEM* EventItem;
  2533. } KSEVENT_SET, *PKSEVENT_SET;
  2534.  
  2535. typedef struct {
  2536.     KDPC            Dpc;
  2537.     ULONG           ReferenceCount;
  2538.     KSPIN_LOCK      AccessLock;
  2539. } KSDPC_ITEM, *PKSDPC_ITEM;
  2540.  
  2541. typedef struct {
  2542.     KSDPC_ITEM          DpcItem;
  2543.     LIST_ENTRY          BufferList;
  2544. } KSBUFFER_ITEM, *PKSBUFFER_ITEM;
  2545.  
  2546. #define KSEVENT_ENTRY_DELETED   1
  2547. #define KSEVENT_ENTRY_ONESHOT   2
  2548. #define KSEVENT_ENTRY_BUFFERED  4
  2549.  
  2550. struct _KSEVENT_ENTRY {
  2551.     LIST_ENTRY      ListEntry;
  2552.     PVOID           Object;
  2553.     union {
  2554.         PKSDPC_ITEM         DpcItem;
  2555.         PKSBUFFER_ITEM      BufferItem;
  2556.     };
  2557.     PKSEVENTDATA        EventData;
  2558.     ULONG               NotificationType;
  2559.     const KSEVENT_SET*  EventSet;
  2560.     const KSEVENT_ITEM* EventItem;
  2561.     PFILE_OBJECT        FileObject;
  2562.     ULONG               SemaphoreAdjustment;
  2563.     ULONG               Reserved;
  2564.     ULONG               Flags;
  2565. };
  2566.  
  2567. typedef enum {
  2568.     KSEVENTS_NONE,
  2569.     KSEVENTS_SPINLOCK,
  2570.     KSEVENTS_MUTEX,
  2571.     KSEVENTS_FMUTEX,
  2572.     KSEVENTS_FMUTEXUNSAFE,
  2573.     KSEVENTS_INTERRUPT,
  2574.     KSEVENTS_ERESOURCE
  2575. } KSEVENTS_LOCKTYPE;
  2576.  
  2577. #define KSDISPATCH_FASTIO       0x80000000
  2578.  
  2579. typedef struct {
  2580.     PDRIVER_DISPATCH        Create;
  2581.     PVOID                   Context;
  2582.     UNICODE_STRING          ObjectClass;
  2583.     PSECURITY_DESCRIPTOR    SecurityDescriptor;
  2584.     ULONG                   Flags;
  2585. } KSOBJECT_CREATE_ITEM, *PKSOBJECT_CREATE_ITEM;
  2586.  
  2587. typedef
  2588. VOID
  2589. (*PFNKSITEMFREECALLBACK)(
  2590.     IN PKSOBJECT_CREATE_ITEM CreateItem
  2591.     );
  2592.  
  2593. #define KSCREATE_ITEM_SECURITYCHANGED       0x00000001
  2594. #define KSCREATE_ITEM_WILDCARD              0x00000002
  2595. #define KSCREATE_ITEM_NOPARAMETERS          0x00000004
  2596. #define KSCREATE_ITEM_FREEONSTOP            0x00000008
  2597.  
  2598. #define DEFINE_KSCREATE_DISPATCH_TABLE( tablename )\
  2599.     KSOBJECT_CREATE_ITEM tablename[] =
  2600.  
  2601. #define DEFINE_KSCREATE_ITEM(DispatchCreate, TypeName, Context)\
  2602. {\
  2603.     (DispatchCreate),\
  2604.     (PVOID)(Context),\
  2605.     {\
  2606.         sizeof(TypeName) - sizeof(UNICODE_NULL),\
  2607.         sizeof(TypeName),\
  2608.         (PWCHAR)(TypeName)\
  2609.     },\
  2610.     NULL, 0\
  2611. }
  2612.  
  2613. #define DEFINE_KSCREATE_ITEMEX(DispatchCreate, TypeName, Context, Flags)\
  2614. {\
  2615.     (DispatchCreate),\
  2616.     (PVOID)(Context),\
  2617.     {\
  2618.         sizeof(TypeName) - sizeof(UNICODE_NULL),\
  2619.         sizeof(TypeName),\
  2620.         (PWCHAR)(TypeName)\
  2621.     },\
  2622.     NULL, (Flags)\
  2623. }
  2624.  
  2625. #define DEFINE_KSCREATE_ITEMNULL( DispatchCreate, Context )\
  2626. {\
  2627.     DispatchCreate,\
  2628.     Context,\
  2629.     {\
  2630.         0,\
  2631.         0,\
  2632.         NULL,\
  2633.     },\
  2634.     NULL, 0\
  2635. }
  2636.  
  2637. typedef struct {
  2638.     ULONG                    CreateItemsCount;
  2639.     PKSOBJECT_CREATE_ITEM    CreateItemsList;
  2640. } KSOBJECT_CREATE, *PKSOBJECT_CREATE;
  2641.  
  2642. typedef struct {
  2643.     PDRIVER_DISPATCH        DeviceIoControl;
  2644.     PDRIVER_DISPATCH        Read;
  2645.     PDRIVER_DISPATCH        Write;
  2646.     PDRIVER_DISPATCH        Flush;
  2647.     PDRIVER_DISPATCH        Close;
  2648.     PDRIVER_DISPATCH        QuerySecurity;
  2649.     PDRIVER_DISPATCH        SetSecurity;
  2650.     PFAST_IO_DEVICE_CONTROL FastDeviceIoControl;
  2651.     PFAST_IO_READ           FastRead;
  2652.     PFAST_IO_WRITE          FastWrite;
  2653. } KSDISPATCH_TABLE, *PKSDISPATCH_TABLE;
  2654.  
  2655. #define DEFINE_KSDISPATCH_TABLE( tablename, DeviceIoControl, Read, Write,\
  2656.                                  Flush, Close, QuerySecurity, SetSecurity,\
  2657.                                  FastDeviceIoControl, FastRead, FastWrite  )\
  2658.     const KSDISPATCH_TABLE tablename = \
  2659.     {\
  2660.         DeviceIoControl,        \
  2661.         Read,                   \
  2662.         Write,                  \
  2663.         Flush,                  \
  2664.         Close,                  \
  2665.         QuerySecurity,          \
  2666.         SetSecurity,            \
  2667.         FastDeviceIoControl,    \
  2668.         FastRead,               \
  2669.         FastWrite,              \
  2670.     }
  2671.  
  2672. #define KSCREATE_ITEM_IRP_STORAGE(Irp)      (*(PKSOBJECT_CREATE_ITEM*)&(Irp)->Tail.Overlay.DriverContext[0])
  2673. #define KSEVENT_SET_IRP_STORAGE(Irp)        (*(const KSEVENT_SET**)&(Irp)->Tail.Overlay.DriverContext[0])
  2674. #define KSEVENT_ITEM_IRP_STORAGE(Irp)       (*(const KSEVENT_ITEM**)&(Irp)->Tail.Overlay.DriverContext[3])
  2675. #define KSEVENT_ENTRY_IRP_STORAGE(Irp)      (*(PKSEVENT_ENTRY*)&(Irp)->Tail.Overlay.DriverContext[0])
  2676. #define KSMETHOD_SET_IRP_STORAGE(Irp)       (*(const KSMETHOD_SET**)&(Irp)->Tail.Overlay.DriverContext[0])
  2677. #define KSMETHOD_ITEM_IRP_STORAGE(Irp)      (*(const KSMETHOD_ITEM**)&(Irp)->Tail.Overlay.DriverContext[3])
  2678. #define KSMETHOD_TYPE_IRP_STORAGE(Irp)      (*(ULONG_PTR*)(&(Irp)->Tail.Overlay.DriverContext[2]))
  2679. #define KSQUEUE_SPINLOCK_IRP_STORAGE(Irp)   (*(PKSPIN_LOCK*)&(Irp)->Tail.Overlay.DriverContext[1])
  2680. #define KSPROPERTY_SET_IRP_STORAGE(Irp)     (*(const KSPROPERTY_SET**)&(Irp)->Tail.Overlay.DriverContext[0])
  2681. #define KSPROPERTY_ITEM_IRP_STORAGE(Irp)    (*(const KSPROPERTY_ITEM**)&(Irp)->Tail.Overlay.DriverContext[3])
  2682. #define KSPROPERTY_ATTRIBUTES_IRP_STORAGE(Irp) (*(PKSATTRIBUTE_LIST*)&(Irp)->Tail.Overlay.DriverContext[2])
  2683.  
  2684. typedef PVOID   KSDEVICE_HEADER, KSOBJECT_HEADER;
  2685.  
  2686. typedef enum {
  2687.     KsInvokeOnSuccess = 1,
  2688.     KsInvokeOnError = 2,
  2689.     KsInvokeOnCancel = 4
  2690. } KSCOMPLETION_INVOCATION;
  2691.  
  2692. typedef enum {
  2693.     KsListEntryTail,
  2694.     KsListEntryHead
  2695. } KSLIST_ENTRY_LOCATION;
  2696.  
  2697. typedef enum {
  2698.     KsAcquireOnly,
  2699.     KsAcquireAndRemove,
  2700.     KsAcquireOnlySingleItem,
  2701.     KsAcquireAndRemoveOnlySingleItem
  2702. } KSIRP_REMOVAL_OPERATION;
  2703.  
  2704. typedef enum {
  2705.     KsStackCopyToNewLocation,
  2706.     KsStackReuseCurrentLocation,
  2707.     KsStackUseNewLocation
  2708. } KSSTACK_USE;
  2709.  
  2710. typedef enum {
  2711.     KSTARGET_STATE_DISABLED,
  2712.     KSTARGET_STATE_ENABLED
  2713. } KSTARGET_STATE;
  2714.  
  2715. typedef
  2716. NTSTATUS
  2717. (*PFNKSIRPLISTCALLBACK)(
  2718.     IN PIRP Irp,
  2719.     IN PVOID Context
  2720.     );
  2721.  
  2722. typedef 
  2723. VOID 
  2724. (*PFNREFERENCEDEVICEOBJECT)( 
  2725.     IN PVOID Context
  2726.     );
  2727.     
  2728. typedef 
  2729. VOID 
  2730. (*PFNDEREFERENCEDEVICEOBJECT)( 
  2731.     IN PVOID Context
  2732.     );
  2733.     
  2734. typedef
  2735. NTSTATUS
  2736. (*PFNQUERYREFERENCESTRING)( 
  2737.     IN PVOID Context,
  2738.     IN OUT PWCHAR *String
  2739.     );
  2740.  
  2741. #define BUS_INTERFACE_REFERENCE_VERSION    0x100
  2742.     
  2743. typedef struct {
  2744.     //
  2745.     // Standard interface header
  2746.     //
  2747.     
  2748.     INTERFACE                   Interface;
  2749.     
  2750.     //
  2751.     // Standard bus interfaces
  2752.     //
  2753.     
  2754.     PFNREFERENCEDEVICEOBJECT    ReferenceDeviceObject;
  2755.     PFNDEREFERENCEDEVICEOBJECT  DereferenceDeviceObject;
  2756.     PFNQUERYREFERENCESTRING     QueryReferenceString;
  2757.     
  2758. } BUS_INTERFACE_REFERENCE, *PBUS_INTERFACE_REFERENCE;
  2759.  
  2760. #define STATIC_REFERENCE_BUS_INTERFACE STATIC_KSMEDIUMSETID_Standard
  2761. #define REFERENCE_BUS_INTERFACE KSMEDIUMSETID_Standard
  2762.  
  2763. typedef
  2764. NTSTATUS
  2765. (*PFNQUERYMEDIUMSLIST)( 
  2766.     IN PVOID Context,
  2767.     OUT ULONG* MediumsCount,
  2768.     OUT PKSPIN_MEDIUM* MediumList
  2769.     );
  2770.  
  2771. typedef struct {
  2772.     //
  2773.     // Standard interface header
  2774.     //
  2775.     
  2776.     INTERFACE                   Interface;
  2777.     
  2778.     //
  2779.     // Interface definition
  2780.     //
  2781.     
  2782.     PFNQUERYMEDIUMSLIST         QueryMediumsList;
  2783.     
  2784. } BUS_INTERFACE_MEDIUMS, *PBUS_INTERFACE_MEDIUMS;
  2785.  
  2786. #define STATIC_GUID_BUS_INTERFACE_MEDIUMS \
  2787.     0x4EC35C3EL, 0x201B, 0x11D2, 0x87, 0x45, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  2788. DEFINE_GUIDSTRUCT("4EC35C3E-201B-11D2-8745-00A0C9223196", GUID_BUS_INTERFACE_MEDIUMS);
  2789. #define GUID_BUS_INTERFACE_MEDIUMS DEFINE_GUIDNAMED(GUID_BUS_INTERFACE_MEDIUMS)
  2790.  
  2791. #endif // defined(_NTDDK_)
  2792.  
  2793. #if !defined( PACK_PRAGMAS_NOT_SUPPORTED )
  2794. #include <pshpack1.h>
  2795. #endif
  2796.  
  2797. typedef struct {
  2798.     GUID            PropertySet;
  2799.     ULONG           Count;
  2800. } KSPROPERTY_SERIALHDR, *PKSPROPERTY_SERIALHDR;
  2801.  
  2802. #if !defined( PACK_PRAGMAS_NOT_SUPPORTED )
  2803. #include <poppack.h>
  2804. #endif
  2805.  
  2806. typedef struct {
  2807.     KSIDENTIFIER    PropTypeSet;
  2808.     ULONG           Id;
  2809.     ULONG           PropertyLength;
  2810. } KSPROPERTY_SERIAL, *PKSPROPERTY_SERIAL;
  2811.  
  2812. #if defined(_NTDDK_)
  2813.  
  2814. #define IOCTL_KS_HANDSHAKE             CTL_CODE(FILE_DEVICE_KS, 0x007, METHOD_NEITHER, FILE_ANY_ACCESS)
  2815.  
  2816. typedef struct {
  2817.     GUID ProtocolId;
  2818.     PVOID Argument1;
  2819.     PVOID Argument2;
  2820. } KSHANDSHAKE, *PKSHANDSHAKE;
  2821.  
  2822. typedef struct _KSGATE
  2823. KSGATE, *PKSGATE;
  2824.  
  2825. struct _KSGATE {
  2826.     LONG Count;
  2827.     PKSGATE NextGate;
  2828. };
  2829.  
  2830. #ifndef _NTOS_
  2831.  
  2832. void __inline
  2833. KsGateTurnInputOn(
  2834.     IN PKSGATE Gate OPTIONAL
  2835.     )
  2836. {
  2837.     while (Gate && (InterlockedIncrement(&Gate->Count) == 1)) {
  2838.         Gate = Gate->NextGate;
  2839.     }
  2840. }
  2841.  
  2842. void __inline
  2843. KsGateTurnInputOff(
  2844.     IN PKSGATE Gate OPTIONAL
  2845.     )
  2846. {
  2847.     while (Gate && (InterlockedDecrement(&Gate->Count) == 0)) {
  2848.         Gate = Gate->NextGate;
  2849.     }
  2850. }
  2851.  
  2852. BOOLEAN __inline
  2853. KsGateGetStateUnsafe(
  2854.     IN PKSGATE Gate
  2855.     )
  2856. {
  2857.     ASSERT(Gate);
  2858.     return Gate->Count > 0;
  2859. }
  2860.  
  2861. BOOLEAN __inline
  2862. KsGateCaptureThreshold(
  2863.     IN PKSGATE Gate
  2864.     )
  2865. {
  2866.     BOOLEAN captured;
  2867.  
  2868.     ASSERT(Gate);
  2869.  
  2870.     captured = (BOOLEAN)(InterlockedCompareExchange(&Gate->Count,0,1) == 1);
  2871.     
  2872.     //
  2873.     // If we made a transition, it must be propagated.
  2874.     //
  2875.     if (captured) {
  2876.         KsGateTurnInputOff(Gate->NextGate);
  2877.     }
  2878.  
  2879.     //
  2880.     // We return whatever the state was prior to the compare/exchange.  If
  2881.     // the state was on, the state is now off.
  2882.     //
  2883.     return captured;
  2884. }
  2885.  
  2886. void __inline
  2887. KsGateInitialize(
  2888.     IN PKSGATE Gate,
  2889.     IN LONG InitialCount,
  2890.     IN PKSGATE NextGate OPTIONAL,
  2891.     IN BOOLEAN StateToPropagate // IN BOOLEAN NextGateIsAnOrGate
  2892.     )
  2893. {
  2894.     ASSERT(Gate);
  2895.     Gate->Count = InitialCount;
  2896.     Gate->NextGate = NextGate;
  2897.  
  2898.     if (NextGate) {
  2899.         if (InitialCount > 0) {
  2900.             if (StateToPropagate) {
  2901.                 KsGateTurnInputOn(NextGate);
  2902.             }
  2903.         } else {
  2904.             if (! StateToPropagate) {
  2905.                 KsGateTurnInputOff(NextGate);
  2906.             }
  2907.         }
  2908.     }
  2909. }
  2910.  
  2911. void __inline
  2912. KsGateInitializeAnd(
  2913.     IN PKSGATE AndGate,
  2914.     IN PKSGATE NextOrGate OPTIONAL
  2915.     )
  2916. {
  2917.     KsGateInitialize(AndGate,1,NextOrGate,TRUE);
  2918. }
  2919.  
  2920. void __inline
  2921. KsGateInitializeOr(
  2922.     IN PKSGATE OrGate,
  2923.     IN PKSGATE NextAndGate OPTIONAL
  2924.     )
  2925. {
  2926.     KsGateInitialize(OrGate,0,NextAndGate,FALSE);
  2927. }
  2928.  
  2929. void __inline KsGateAddOnInputToAnd(IN PKSGATE AndGate) { UNREFERENCED_PARAMETER (AndGate); }
  2930. void __inline KsGateAddOffInputToAnd(IN PKSGATE AndGate) { KsGateTurnInputOff(AndGate); }
  2931. void __inline KsGateRemoveOnInputFromAnd(IN PKSGATE AndGate) { UNREFERENCED_PARAMETER (AndGate); }
  2932. void __inline KsGateRemoveOffInputFromAnd(IN PKSGATE AndGate) { KsGateTurnInputOn(AndGate); }
  2933.  
  2934. void __inline KsGateAddOnInputToOr(IN PKSGATE OrGate) { KsGateTurnInputOn(OrGate); }
  2935. void __inline KsGateAddOffInputToOr(IN PKSGATE OrGate) { UNREFERENCED_PARAMETER (OrGate); }
  2936. void __inline KsGateRemoveOnInputFromOr(IN PKSGATE OrGate) { KsGateTurnInputOff(OrGate); }
  2937. void __inline KsGateRemoveOffInputFromOr(IN PKSGATE OrGate) { UNREFERENCED_PARAMETER (OrGate); }
  2938.  
  2939. void __inline
  2940. KsGateTerminateAnd(
  2941.     IN PKSGATE AndGate
  2942.     )
  2943. {
  2944.     ASSERT(AndGate);
  2945.     if (KsGateGetStateUnsafe(AndGate)) {
  2946.         KsGateRemoveOnInputFromOr(AndGate->NextGate);
  2947.     } else {
  2948.         KsGateRemoveOffInputFromOr(AndGate->NextGate);
  2949.     }
  2950. }
  2951.  
  2952. void __inline
  2953. KsGateTerminateOr(
  2954.     IN PKSGATE OrGate
  2955.     )
  2956. {
  2957.     ASSERT(OrGate);
  2958.     if (KsGateGetStateUnsafe(OrGate)) {
  2959.         KsGateRemoveOnInputFromAnd(OrGate->NextGate);
  2960.     } else {
  2961.         KsGateRemoveOffInputFromAnd(OrGate->NextGate);
  2962.     }
  2963. }
  2964.  
  2965. #endif // !_NTOS_
  2966.  
  2967. typedef PVOID KSOBJECT_BAG;
  2968.  
  2969. typedef
  2970. BOOLEAN
  2971. (*PFNKSGENERATEEVENTCALLBACK)(
  2972.     IN PVOID Context,
  2973.     IN PKSEVENT_ENTRY EventEntry
  2974.     );
  2975.  
  2976. typedef
  2977. NTSTATUS
  2978. (*PFNKSDEVICECREATE)(
  2979.     IN PKSDEVICE Device
  2980.     );
  2981. typedef
  2982. NTSTATUS
  2983. (*PFNKSDEVICEPNPSTART)(
  2984.     IN PKSDEVICE Device,
  2985.     IN PIRP Irp,
  2986.     IN PCM_RESOURCE_LIST TranslatedResourceList OPTIONAL,
  2987.     IN PCM_RESOURCE_LIST UntranslatedResourceList OPTIONAL
  2988.     );
  2989. typedef
  2990. NTSTATUS
  2991. (*PFNKSDEVICE)(
  2992.     IN PKSDEVICE Device
  2993.     );
  2994. typedef
  2995. NTSTATUS
  2996. (*PFNKSDEVICEIRP)(
  2997.     IN PKSDEVICE Device,
  2998.     IN PIRP Irp
  2999.     );
  3000. typedef
  3001. void
  3002. (*PFNKSDEVICEIRPVOID)(
  3003.     IN PKSDEVICE Device,
  3004.     IN PIRP Irp
  3005.     );
  3006. typedef
  3007. NTSTATUS
  3008. (*PFNKSDEVICEQUERYCAPABILITIES)(
  3009.     IN PKSDEVICE Device,
  3010.     IN PIRP Irp,
  3011.     IN OUT PDEVICE_CAPABILITIES Capabilities
  3012.     );
  3013. typedef
  3014. NTSTATUS
  3015. (*PFNKSDEVICEQUERYPOWER)(
  3016.     IN PKSDEVICE Device,
  3017.     IN PIRP Irp,
  3018.     IN DEVICE_POWER_STATE DeviceTo,
  3019.     IN DEVICE_POWER_STATE DeviceFrom,
  3020.     IN SYSTEM_POWER_STATE SystemTo,
  3021.     IN SYSTEM_POWER_STATE SystemFrom,
  3022.     IN POWER_ACTION Action
  3023.     );
  3024. typedef
  3025. void
  3026. (*PFNKSDEVICESETPOWER)(
  3027.     IN PKSDEVICE Device,
  3028.     IN PIRP Irp,
  3029.     IN DEVICE_POWER_STATE To,
  3030.     IN DEVICE_POWER_STATE From
  3031.     );
  3032. typedef
  3033. NTSTATUS
  3034. (*PFNKSFILTERFACTORYVOID)(
  3035.     IN PKSFILTERFACTORY FilterFactory
  3036.     );
  3037. typedef
  3038. void
  3039. (*PFNKSFILTERFACTORYPOWER)(
  3040.     IN PKSFILTERFACTORY FilterFactory,
  3041.     IN DEVICE_POWER_STATE State
  3042.     );
  3043. typedef
  3044. NTSTATUS
  3045. (*PFNKSFILTERIRP)(
  3046.     IN PKSFILTER Filter,
  3047.     IN PIRP Irp
  3048.     );
  3049. typedef
  3050. NTSTATUS
  3051. (*PFNKSFILTERPROCESS)(
  3052.     IN PKSFILTER Filter,
  3053.     IN PKSPROCESSPIN_INDEXENTRY Index
  3054.     );
  3055. typedef
  3056. NTSTATUS
  3057. (*PFNKSFILTERVOID)(
  3058.     IN PKSFILTER Filter
  3059.     );
  3060. typedef
  3061. void
  3062. (*PFNKSFILTERPOWER)(
  3063.     IN PKSFILTER Filter,
  3064.     IN DEVICE_POWER_STATE State
  3065.     );
  3066. typedef
  3067. NTSTATUS
  3068. (*PFNKSPINIRP)(
  3069.     IN PKSPIN Pin,
  3070.     IN PIRP Irp
  3071.     );
  3072. typedef
  3073. NTSTATUS
  3074. (*PFNKSPINSETDEVICESTATE)(
  3075.     IN PKSPIN Pin,
  3076.     IN KSSTATE ToState,
  3077.     IN KSSTATE FromState
  3078.     );
  3079. typedef
  3080. NTSTATUS
  3081. (*PFNKSPINSETDATAFORMAT)(
  3082.     IN PKSPIN Pin,
  3083.     IN PKSDATAFORMAT OldFormat OPTIONAL,
  3084.     IN PKSMULTIPLE_ITEM OldAttributeList OPTIONAL,
  3085.     IN const KSDATARANGE* DataRange,
  3086.     IN const KSATTRIBUTE_LIST* AttributeRange OPTIONAL
  3087.     );
  3088. typedef
  3089. NTSTATUS
  3090. (*PFNKSPINHANDSHAKE)(
  3091.     IN PKSPIN Pin,
  3092.     IN PKSHANDSHAKE In,
  3093.     IN PKSHANDSHAKE Out
  3094.     );
  3095. typedef
  3096. NTSTATUS
  3097. (*PFNKSPIN)(
  3098.     IN PKSPIN Pin
  3099.     );
  3100. typedef
  3101. void
  3102. (*PFNKSPINVOID)(
  3103.     IN PKSPIN Pin
  3104.     );
  3105. typedef
  3106. void
  3107. (*PFNKSPINPOWER)(
  3108.     IN PKSPIN Pin,
  3109.     IN DEVICE_POWER_STATE State
  3110.     );
  3111. typedef
  3112. BOOLEAN
  3113. (*PFNKSPINSETTIMER)(
  3114.     IN PKSPIN Pin,
  3115.     IN PKTIMER Timer,
  3116.     IN LARGE_INTEGER DueTime,
  3117.     IN PKDPC Dpc
  3118.     );
  3119. typedef
  3120. BOOLEAN
  3121. (*PFNKSPINCANCELTIMER)(
  3122.     IN PKSPIN Pin,
  3123.     IN PKTIMER Timer
  3124.     );
  3125. typedef
  3126. LONGLONG
  3127. (FASTCALL *PFNKSPINCORRELATEDTIME)(
  3128.     IN PKSPIN Pin,
  3129.     OUT PLONGLONG SystemTime
  3130.     );
  3131. typedef
  3132. void
  3133. (*PFNKSPINRESOLUTION)(
  3134.     IN PKSPIN Pin,
  3135.     OUT PKSRESOLUTION Resolution
  3136.     );
  3137. typedef
  3138. NTSTATUS
  3139. (*PFNKSPININITIALIZEALLOCATOR)(
  3140.     IN PKSPIN Pin,
  3141.     IN PKSALLOCATOR_FRAMING AllocatorFraming,
  3142.     OUT PVOID* Context
  3143.     );
  3144. typedef
  3145. void
  3146. (*PFNKSSTREAMPOINTER)(
  3147.     IN PKSSTREAM_POINTER StreamPointer
  3148.     );
  3149.  
  3150. typedef struct KSAUTOMATION_TABLE_ 
  3151. KSAUTOMATION_TABLE, *PKSAUTOMATION_TABLE;
  3152. struct KSAUTOMATION_TABLE_ {
  3153.     ULONG PropertySetsCount;
  3154.     ULONG PropertyItemSize;
  3155.     const KSPROPERTY_SET* PropertySets;
  3156.     ULONG MethodSetsCount;
  3157.     ULONG MethodItemSize;
  3158.     const KSMETHOD_SET* MethodSets;
  3159.     ULONG EventSetsCount;
  3160.     ULONG EventItemSize;
  3161.     const KSEVENT_SET* EventSets;
  3162. #if !defined(_WIN64)
  3163.     PVOID Alignment;
  3164. #endif // !defined(_WIN64)
  3165. };
  3166.  
  3167. #define DEFINE_KSAUTOMATION_TABLE(table)\
  3168.     const KSAUTOMATION_TABLE table =
  3169.  
  3170. #define DEFINE_KSAUTOMATION_PROPERTIES(table)\
  3171.     SIZEOF_ARRAY(table),\
  3172.     sizeof(KSPROPERTY_ITEM),\
  3173.     table
  3174.  
  3175. #define DEFINE_KSAUTOMATION_METHODS(table)\
  3176.     SIZEOF_ARRAY(table),\
  3177.     sizeof(KSMETHOD_ITEM),\
  3178.     table
  3179.  
  3180. #define DEFINE_KSAUTOMATION_EVENTS(table)\
  3181.     SIZEOF_ARRAY(table),\
  3182.     sizeof(KSEVENT_ITEM),\
  3183.     table
  3184.  
  3185. #define DEFINE_KSAUTOMATION_PROPERTIES_NULL\
  3186.     0,\
  3187.     sizeof(KSPROPERTY_ITEM),\
  3188.     NULL
  3189.  
  3190. #define DEFINE_KSAUTOMATION_METHODS_NULL\
  3191.     0,\
  3192.     sizeof(KSMETHOD_ITEM),\
  3193.     NULL
  3194.  
  3195. #define DEFINE_KSAUTOMATION_EVENTS_NULL\
  3196.     0,\
  3197.     sizeof(KSEVENT_ITEM),\
  3198.     NULL
  3199.  
  3200. #define MIN_DEV_VER_FOR_QI (0x100)
  3201.  
  3202. struct _KSDEVICE_DISPATCH {
  3203.     PFNKSDEVICECREATE Add;
  3204.     PFNKSDEVICEPNPSTART Start;
  3205.     PFNKSDEVICE PostStart;
  3206.     PFNKSDEVICEIRP QueryStop;
  3207.     PFNKSDEVICEIRPVOID CancelStop;
  3208.     PFNKSDEVICEIRPVOID Stop;
  3209.     PFNKSDEVICEIRP QueryRemove;
  3210.     PFNKSDEVICEIRPVOID CancelRemove;
  3211.     PFNKSDEVICEIRPVOID Remove;
  3212.     PFNKSDEVICEQUERYCAPABILITIES QueryCapabilities;
  3213.     PFNKSDEVICEIRPVOID SurpriseRemoval;
  3214.     PFNKSDEVICEQUERYPOWER QueryPower;
  3215.     PFNKSDEVICESETPOWER SetPower;
  3216.     PFNKSDEVICEIRP QueryInterface;  // added in version 0x100
  3217. };
  3218.  
  3219. struct _KSFILTER_DISPATCH {
  3220.     PFNKSFILTERIRP Create;
  3221.     PFNKSFILTERIRP Close;
  3222.     PFNKSFILTERPROCESS Process;
  3223.     PFNKSFILTERVOID Reset;
  3224. };
  3225.  
  3226. struct _KSPIN_DISPATCH {
  3227.     PFNKSPINIRP Create;
  3228.     PFNKSPINIRP Close;
  3229.     PFNKSPIN Process;
  3230.     PFNKSPINVOID Reset;
  3231.     PFNKSPINSETDATAFORMAT SetDataFormat;
  3232.     PFNKSPINSETDEVICESTATE SetDeviceState;
  3233.     PFNKSPIN Connect;
  3234.     PFNKSPINVOID Disconnect;
  3235.     const KSCLOCK_DISPATCH* Clock;
  3236.     const KSALLOCATOR_DISPATCH* Allocator;
  3237. };
  3238.  
  3239. struct _KSCLOCK_DISPATCH {
  3240.     PFNKSPINSETTIMER SetTimer;
  3241.     PFNKSPINCANCELTIMER CancelTimer;
  3242.     PFNKSPINCORRELATEDTIME CorrelatedTime;
  3243.     PFNKSPINRESOLUTION Resolution;
  3244. };
  3245.  
  3246. struct _KSALLOCATOR_DISPATCH {
  3247.     PFNKSPININITIALIZEALLOCATOR InitializeAllocator;
  3248.     PFNKSDELETEALLOCATOR DeleteAllocator;
  3249.     PFNKSDEFAULTALLOCATE Allocate;
  3250.     PFNKSDEFAULTFREE Free;
  3251. };
  3252.  
  3253. #define KSDEVICE_DESCRIPTOR_VERSION (0x100)
  3254.  
  3255. struct _KSDEVICE_DESCRIPTOR {
  3256.     const KSDEVICE_DISPATCH* Dispatch;
  3257.     ULONG FilterDescriptorsCount;
  3258.     const KSFILTER_DESCRIPTOR*const* FilterDescriptors;
  3259.     ULONG Version; // this is 0 for pre-version 100 driver
  3260.     //#if !defined(_WIN64)
  3261.     //PVOID Alignment;
  3262.     //#endif //!defined(_WIN64)
  3263. };
  3264.  
  3265. struct _KSFILTER_DESCRIPTOR {
  3266.     const KSFILTER_DISPATCH* Dispatch;
  3267.     const KSAUTOMATION_TABLE* AutomationTable;
  3268.     ULONG Version;
  3269. #define KSFILTER_DESCRIPTOR_VERSION ((ULONG)-1)
  3270.     ULONG Flags;
  3271. #define KSFILTER_FLAG_DISPATCH_LEVEL_PROCESSING 0x00000001
  3272. #define KSFILTER_FLAG_CRITICAL_PROCESSING 0x00000002
  3273. #define KSFILTER_FLAG_HYPERCRITICAL_PROCESSING 0x00000004
  3274. #define KSFILTER_FLAG_RECEIVE_ZERO_LENGTH_SAMPLES 0x00000008
  3275.     const GUID* ReferenceGuid;
  3276.     ULONG PinDescriptorsCount;
  3277.     ULONG PinDescriptorSize;
  3278.     const KSPIN_DESCRIPTOR_EX* PinDescriptors;
  3279.     ULONG CategoriesCount;
  3280.     const GUID* Categories;
  3281.     ULONG NodeDescriptorsCount;
  3282.     ULONG NodeDescriptorSize;
  3283.     const KSNODE_DESCRIPTOR* NodeDescriptors;
  3284.     ULONG ConnectionsCount;
  3285.     const KSTOPOLOGY_CONNECTION* Connections;
  3286.     const KSCOMPONENTID* ComponentId;
  3287. };
  3288.  
  3289. #define DEFINE_KSFILTER_DESCRIPTOR(descriptor)\
  3290.     const KSFILTER_DESCRIPTOR descriptor =
  3291.  
  3292. #define DEFINE_KSFILTER_PIN_DESCRIPTORS(table)\
  3293.     SIZEOF_ARRAY(table),\
  3294.     sizeof(table[0]),\
  3295.     table
  3296.  
  3297. #define DEFINE_KSFILTER_CATEGORIES(table)\
  3298.     SIZEOF_ARRAY(table),\
  3299.     table
  3300.  
  3301. #define DEFINE_KSFILTER_CATEGORY(category)\
  3302.     1,\
  3303.     &(category)
  3304.  
  3305. #define DEFINE_KSFILTER_CATEGORIES_NULL\
  3306.     0,\
  3307.     NULL
  3308.  
  3309. #define DEFINE_KSFILTER_NODE_DESCRIPTORS(table)\
  3310.     SIZEOF_ARRAY(table),\
  3311.     sizeof(table[0]),\
  3312.     table
  3313.  
  3314. #define DEFINE_KSFILTER_NODE_DESCRIPTORS_NULL\
  3315.     0,\
  3316.     sizeof(KSNODE_DESCRIPTOR),\
  3317.     NULL
  3318.  
  3319. #define DEFINE_KSFILTER_CONNECTIONS(table)\
  3320.     SIZEOF_ARRAY(table),\
  3321.     table
  3322.  
  3323. #define DEFINE_KSFILTER_DEFAULT_CONNECTIONS\
  3324.     0,\
  3325.     NULL
  3326.  
  3327. #define DEFINE_KSFILTER_DESCRIPTOR_TABLE(table)\
  3328.     const KSFILTER_DESCRIPTOR*const table[] =
  3329.  
  3330. struct _KSPIN_DESCRIPTOR_EX {
  3331.     const KSPIN_DISPATCH* Dispatch;
  3332.     const KSAUTOMATION_TABLE* AutomationTable;
  3333.     KSPIN_DESCRIPTOR PinDescriptor;
  3334.     ULONG Flags;
  3335. #define KSPIN_FLAG_DISPATCH_LEVEL_PROCESSING KSFILTER_FLAG_DISPATCH_LEVEL_PROCESSING
  3336. #define KSPIN_FLAG_CRITICAL_PROCESSING KSFILTER_FLAG_CRITICAL_PROCESSING
  3337. #define KSPIN_FLAG_HYPERCRITICAL_PROCESSING KSFILTER_FLAG_HYPERCRITICAL_PROCESSING
  3338. #define KSPIN_FLAG_ASYNCHRONOUS_PROCESSING 0x00000008
  3339. #define KSPIN_FLAG_DO_NOT_INITIATE_PROCESSING 0x00000010
  3340. #define KSPIN_FLAG_INITIATE_PROCESSING_ON_EVERY_ARRIVAL 0x00000020
  3341. #define KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING 0x00000040
  3342. #define KSPIN_FLAG_ENFORCE_FIFO 0x00000080
  3343.  
  3344. #define KSPIN_FLAG_GENERATE_MAPPINGS 0x00000100
  3345. #define KSPIN_FLAG_DISTINCT_TRAILING_EDGE 0x00000200
  3346.  
  3347. #define KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY 0x00010000
  3348. #define KSPIN_FLAG_SPLITTER 0x00020000
  3349. #define KSPIN_FLAG_USE_STANDARD_TRANSPORT 0x00040000
  3350. #define KSPIN_FLAG_DO_NOT_USE_STANDARD_TRANSPORT 0x00080000
  3351. #define KSPIN_FLAG_FIXED_FORMAT 0x00100000
  3352. #define KSPIN_FLAG_GENERATE_EOS_EVENTS 0x00200000
  3353. #define KSPIN_FLAG_RENDERER (KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY|KSPIN_FLAG_GENERATE_EOS_EVENTS)
  3354. #define KSPIN_FLAG_IMPLEMENT_CLOCK 0x00400000
  3355. #define KSPIN_FLAG_SOME_FRAMES_REQUIRED_FOR_PROCESSING 0x00800000
  3356. #define KSPIN_FLAG_PROCESS_IF_ANY_IN_RUN_STATE 0x01000000
  3357.     ULONG InstancesPossible;
  3358.     ULONG InstancesNecessary;
  3359.     const KSALLOCATOR_FRAMING_EX* AllocatorFraming;
  3360.     PFNKSINTERSECTHANDLEREX IntersectHandler;
  3361. };
  3362.  
  3363. #define DEFINE_KSPIN_DEFAULT_INTERFACES\
  3364.     0,\
  3365.     NULL
  3366.  
  3367. #define DEFINE_KSPIN_DEFAULT_MEDIUMS\
  3368.     0,\
  3369.     NULL
  3370.  
  3371. struct _KSNODE_DESCRIPTOR {
  3372.     const KSAUTOMATION_TABLE* AutomationTable;
  3373.     const GUID* Type;
  3374.     const GUID* Name;
  3375. #if !defined(_WIN64)
  3376.     PVOID Alignment;
  3377. #endif // !defined(_WIN64)
  3378. };
  3379.  
  3380. #if !defined(_WIN64)
  3381. #define DEFINE_NODE_DESCRIPTOR(automation,type,name) \
  3382.     { (automation), (type), (name), NULL }
  3383. #else // !defined(_WIN64)
  3384. #define DEFINE_NODE_DESCRIPTOR(automation,type,name) \
  3385.     { (automation), (type), (name) }
  3386. #endif // !defined(_WIN64)
  3387.  
  3388. struct _KSDEVICE {
  3389.     const KSDEVICE_DESCRIPTOR* Descriptor;
  3390.     KSOBJECT_BAG Bag;
  3391.     PVOID Context;
  3392.     PDEVICE_OBJECT FunctionalDeviceObject;
  3393.     PDEVICE_OBJECT PhysicalDeviceObject;
  3394.     PDEVICE_OBJECT NextDeviceObject;
  3395.     BOOLEAN Started;
  3396.     SYSTEM_POWER_STATE SystemPowerState;
  3397.     DEVICE_POWER_STATE DevicePowerState;
  3398. };
  3399.  
  3400. struct _KSFILTERFACTORY {
  3401.     const KSFILTER_DESCRIPTOR* FilterDescriptor;
  3402.     KSOBJECT_BAG Bag;
  3403.     PVOID Context;
  3404. };
  3405.  
  3406. struct _KSFILTER {
  3407.     const KSFILTER_DESCRIPTOR* Descriptor;
  3408.     KSOBJECT_BAG Bag;
  3409.     PVOID Context;
  3410. };
  3411.  
  3412. struct _KSPIN {
  3413.     const KSPIN_DESCRIPTOR_EX* Descriptor;
  3414.     KSOBJECT_BAG Bag;
  3415.     PVOID Context;
  3416.     ULONG Id;
  3417.     KSPIN_COMMUNICATION Communication;
  3418.     BOOLEAN ConnectionIsExternal;
  3419.     KSPIN_INTERFACE ConnectionInterface;
  3420.     KSPIN_MEDIUM ConnectionMedium;
  3421.     KSPRIORITY ConnectionPriority;
  3422.     PKSDATAFORMAT ConnectionFormat;
  3423.     PKSMULTIPLE_ITEM AttributeList;
  3424.     ULONG StreamHeaderSize;
  3425.     KSPIN_DATAFLOW DataFlow;
  3426.     KSSTATE DeviceState;
  3427.     KSRESET ResetState;
  3428.     KSSTATE ClientState;
  3429. };
  3430.  
  3431. struct _KSMAPPING {
  3432.     PHYSICAL_ADDRESS PhysicalAddress;
  3433.     ULONG ByteCount;
  3434.     ULONG Alignment;
  3435. };
  3436.  
  3437. struct _KSSTREAM_POINTER_OFFSET
  3438. {
  3439. #if defined(_NTDDK_)
  3440.     union {
  3441.         PUCHAR Data;
  3442.         PKSMAPPING Mappings;
  3443.     };
  3444. #else // !defined(_NTDDK_)
  3445.     PUCHAR Data;
  3446. #endif // !defined(_NTDDK_)
  3447. #if !defined(_WIN64)
  3448.     PVOID Alignment;
  3449. #endif // !defined(_WIN64)
  3450.     ULONG Count;
  3451.     ULONG Remaining;
  3452. };
  3453.  
  3454. struct _KSSTREAM_POINTER
  3455. {
  3456.     PVOID Context;
  3457.     PKSPIN Pin;
  3458.     PKSSTREAM_HEADER StreamHeader;
  3459.     PKSSTREAM_POINTER_OFFSET Offset;
  3460.     KSSTREAM_POINTER_OFFSET OffsetIn;
  3461.     KSSTREAM_POINTER_OFFSET OffsetOut;
  3462. };
  3463.  
  3464. struct _KSPROCESSPIN {
  3465.     PKSPIN Pin;
  3466.     PKSSTREAM_POINTER StreamPointer;
  3467.     PKSPROCESSPIN InPlaceCounterpart;
  3468.     PKSPROCESSPIN DelegateBranch;
  3469.     PKSPROCESSPIN CopySource;
  3470.     PVOID Data;
  3471.     ULONG BytesAvailable;
  3472.     ULONG BytesUsed;
  3473.     ULONG Flags;
  3474.     BOOLEAN Terminate;
  3475. };
  3476.  
  3477. struct _KSPROCESSPIN_INDEXENTRY {
  3478.     PKSPROCESSPIN *Pins;
  3479.     ULONG Count;
  3480. };
  3481.  
  3482. typedef enum {
  3483.     KsObjectTypeDevice,
  3484.     KsObjectTypeFilterFactory,
  3485.     KsObjectTypeFilter,
  3486.     KsObjectTypePin
  3487. } KSOBJECTTYPE;
  3488.  
  3489. typedef
  3490. void
  3491. (*PFNKSFREE)(
  3492.     IN PVOID Data
  3493.     );
  3494.  
  3495. typedef
  3496. void
  3497. (*PFNKSPINFRAMERETURN)(
  3498.     IN PKSPIN Pin,
  3499.     IN PVOID Data OPTIONAL,
  3500.     IN ULONG Size OPTIONAL,
  3501.     IN PMDL Mdl OPTIONAL,
  3502.     IN PVOID Context OPTIONAL,
  3503.     IN NTSTATUS Status
  3504.     );
  3505.  
  3506. typedef
  3507. void
  3508. (*PFNKSPINIRPCOMPLETION)(
  3509.     IN PKSPIN Pin,
  3510.     IN PIRP Irp
  3511.     );
  3512.  
  3513. #if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
  3514. #if !defined(_IKsControl_)
  3515. #define _IKsControl_
  3516.  
  3517. typedef interface IKsControl* PIKSCONTROL;
  3518.  
  3519. #if !defined(DEFINE_ABSTRACT_UNKNOWN)
  3520.  
  3521. #define DEFINE_ABSTRACT_UNKNOWN()                               \
  3522.     STDMETHOD_(NTSTATUS, QueryInterface)(THIS_                   \
  3523.         REFIID InterfaceId,                                     \
  3524.         PVOID* Interface                                        \
  3525.         ) PURE;                                                 \
  3526.     STDMETHOD_(ULONG,AddRef)(THIS) PURE;                        \
  3527.     STDMETHOD_(ULONG,Release)(THIS) PURE;
  3528.  
  3529. #endif //!defined(DEFINE_ABSTRACT_UNKNOWN)
  3530.  
  3531. #undef INTERFACE
  3532. #define INTERFACE IKsControl
  3533. DECLARE_INTERFACE_(IKsControl,IUnknown)
  3534. {
  3535.     DEFINE_ABSTRACT_UNKNOWN() // For C
  3536.  
  3537.     STDMETHOD_(NTSTATUS, KsProperty)(THIS_
  3538.         IN PKSPROPERTY Property,
  3539.         IN ULONG PropertyLength,
  3540.         IN OUT PVOID PropertyData,
  3541.         IN ULONG DataLength,
  3542.         OUT ULONG* BytesReturned
  3543.         ) PURE;
  3544.     STDMETHOD_(NTSTATUS, KsMethod)(THIS_
  3545.         IN PKSMETHOD Method,
  3546.         IN ULONG MethodLength,
  3547.         IN OUT PVOID MethodData,
  3548.         IN ULONG DataLength,
  3549.         OUT ULONG* BytesReturned
  3550.         ) PURE;
  3551.     STDMETHOD_(NTSTATUS, KsEvent)(THIS_
  3552.         IN PKSEVENT Event OPTIONAL,
  3553.         IN ULONG EventLength,
  3554.         IN OUT PVOID EventData,
  3555.         IN ULONG DataLength,
  3556.         OUT ULONG* BytesReturned
  3557.         ) PURE;
  3558. };
  3559.  
  3560. typedef interface IKsReferenceClock* PIKSREFERENCECLOCK;
  3561.  
  3562. #undef INTERFACE
  3563. #define INTERFACE IKsReferenceClock
  3564. DECLARE_INTERFACE_(IKsReferenceClock,IUnknown)
  3565. {
  3566.     DEFINE_ABSTRACT_UNKNOWN() // For C
  3567.  
  3568.     STDMETHOD_(LONGLONG,GetTime)(THIS
  3569.         ) PURE;
  3570.     STDMETHOD_(LONGLONG,GetPhysicalTime)(THIS
  3571.         ) PURE;
  3572.     STDMETHOD_(LONGLONG,GetCorrelatedTime)(THIS_
  3573.         OUT PLONGLONG SystemTime
  3574.         ) PURE;
  3575.     STDMETHOD_(LONGLONG,GetCorrelatedPhysicalTime)(THIS_
  3576.         OUT PLONGLONG SystemTime
  3577.         ) PURE;
  3578.     STDMETHOD_(NTSTATUS, GetResolution)(THIS_
  3579.         OUT PKSRESOLUTION Resolution
  3580.         ) PURE;
  3581.     STDMETHOD_(NTSTATUS, GetState)(THIS_
  3582.         OUT PKSSTATE State
  3583.         ) PURE;
  3584. };
  3585. #undef INTERFACE
  3586.  
  3587. #define STATIC_IID_IKsControl \
  3588. 0x28F54685L, 0x06FD, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  3589. DEFINE_GUID(IID_IKsControl,
  3590. 0x28F54685L, 0x06FD, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96);
  3591. #if defined(__cplusplus) && _MSC_VER >= 1100
  3592. struct __declspec(uuid("28F54685-06FD-11D2-B27A-00A0C9223196")) IKsControl;
  3593. #endif
  3594.  
  3595. #define STATIC_IID_IKsFastClock \
  3596. 0xc9902485, 0xc180, 0x11d2, 0x84, 0x73, 0xd4, 0x23, 0x94, 0x45, 0x9e, 0x5e
  3597. DEFINE_GUID(IID_IKsFastClock,
  3598. 0xc9902485, 0xc180, 0x11d2, 0x84, 0x73, 0xd4, 0x23, 0x94, 0x45, 0x9e, 0x5e);
  3599. #if defined(__cplusplus) && _MSC_VER >= 1100
  3600. struct __declspec(uuid("C9902485-C180-11d2-8473-D42394459E5E")) IKsFastClock;
  3601. #endif
  3602.  
  3603. #endif // !defined(_IKsControl_)
  3604. #endif // defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
  3605.  
  3606. #endif // defined(_NTDDK_)
  3607.  
  3608. //===========================================================================
  3609.  
  3610. #if defined(__cplusplus)
  3611. extern "C" {
  3612. #endif // defined(__cplusplus)
  3613.  
  3614. //
  3615. // exported prototypes
  3616. //
  3617.  
  3618. #ifdef _KSDDK_
  3619. #define KSDDKAPI
  3620. #else // !_KSDDK_
  3621. #define KSDDKAPI DECLSPEC_IMPORT
  3622. #endif // _KSDDK_
  3623.  
  3624. #if defined(_NTDDK_)
  3625.  
  3626. KSDDKAPI
  3627. NTSTATUS
  3628. NTAPI
  3629. KsEnableEvent(
  3630.     IN PIRP Irp,
  3631.     IN ULONG EventSetsCount,
  3632.     IN const KSEVENT_SET* EventSet,
  3633.     IN OUT PLIST_ENTRY EventsList OPTIONAL,
  3634.     IN KSEVENTS_LOCKTYPE EventsFlags OPTIONAL,
  3635.     IN PVOID EventsLock OPTIONAL
  3636.     );
  3637.  
  3638. KSDDKAPI
  3639. NTSTATUS
  3640. NTAPI
  3641. KsEnableEventWithAllocator(
  3642.     IN PIRP Irp,
  3643.     IN ULONG EventSetsCount,
  3644.     IN const KSEVENT_SET* EventSet,
  3645.     IN OUT PLIST_ENTRY EventsList OPTIONAL,
  3646.     IN KSEVENTS_LOCKTYPE EventsFlags OPTIONAL,
  3647.     IN PVOID EventsLock OPTIONAL,
  3648.     IN PFNKSALLOCATOR Allocator OPTIONAL,
  3649.     IN ULONG EventItemSize OPTIONAL
  3650.     );
  3651.  
  3652. KSDDKAPI
  3653. NTSTATUS
  3654. NTAPI
  3655. KsDisableEvent(
  3656.     IN PIRP Irp,
  3657.     IN OUT PLIST_ENTRY EventsList,
  3658.     IN KSEVENTS_LOCKTYPE EventsFlags,
  3659.     IN PVOID EventsLock
  3660.     );
  3661.  
  3662. KSDDKAPI
  3663. VOID
  3664. NTAPI
  3665. KsDiscardEvent(
  3666.     IN PKSEVENT_ENTRY EventEntry
  3667.     );
  3668.  
  3669. KSDDKAPI
  3670. VOID
  3671. NTAPI
  3672. KsFreeEventList(
  3673.     IN PFILE_OBJECT FileObject,
  3674.     IN OUT PLIST_ENTRY EventsList,
  3675.     IN KSEVENTS_LOCKTYPE EventsFlags,
  3676.     IN PVOID EventsLock
  3677.     );
  3678.  
  3679. KSDDKAPI
  3680. NTSTATUS
  3681. NTAPI
  3682. KsGenerateEvent(
  3683.     IN PKSEVENT_ENTRY EventEntry
  3684.     );
  3685.  
  3686. KSDDKAPI
  3687. NTSTATUS
  3688. NTAPI
  3689. KsGenerateDataEvent(
  3690.     IN PKSEVENT_ENTRY EventEntry,
  3691.     IN ULONG DataSize,
  3692.     IN PVOID Data
  3693.     );
  3694.  
  3695. KSDDKAPI
  3696. VOID
  3697. NTAPI
  3698. KsGenerateEventList(
  3699.     IN GUID* Set OPTIONAL,
  3700.     IN ULONG EventId,
  3701.     IN PLIST_ENTRY EventsList,
  3702.     IN KSEVENTS_LOCKTYPE EventsFlags,
  3703.     IN PVOID EventsLock
  3704.     );
  3705.  
  3706. // property.c:
  3707.  
  3708. KSDDKAPI
  3709. NTSTATUS
  3710. NTAPI
  3711. KsPropertyHandler(
  3712.     IN PIRP Irp,
  3713.     IN ULONG PropertySetsCount,
  3714.     IN const KSPROPERTY_SET* PropertySet
  3715.     );
  3716.  
  3717. KSDDKAPI
  3718. NTSTATUS
  3719. NTAPI
  3720. KsPropertyHandlerWithAllocator(
  3721.     IN PIRP Irp,
  3722.     IN ULONG PropertySetsCount,
  3723.     IN const KSPROPERTY_SET* PropertySet,
  3724.     IN PFNKSALLOCATOR Allocator OPTIONAL,
  3725.     IN ULONG PropertyItemSize OPTIONAL
  3726.     );
  3727.  
  3728. KSDDKAPI
  3729. BOOLEAN
  3730. NTAPI
  3731. KsFastPropertyHandler(
  3732.     IN PFILE_OBJECT FileObject,
  3733.     IN PKSPROPERTY Property,
  3734.     IN ULONG PropertyLength,
  3735.     IN OUT PVOID Data,
  3736.     IN ULONG DataLength,
  3737.     OUT PIO_STATUS_BLOCK IoStatus,
  3738.     IN ULONG PropertySetsCount,
  3739.     IN const KSPROPERTY_SET* PropertySet
  3740.     );
  3741.  
  3742. // method.c:
  3743.  
  3744. KSDDKAPI
  3745. NTSTATUS
  3746. NTAPI
  3747. KsMethodHandler(
  3748.     IN PIRP Irp,
  3749.     IN ULONG MethodSetsCount,
  3750.     IN const KSMETHOD_SET* MethodSet
  3751.     );
  3752.  
  3753. KSDDKAPI
  3754. NTSTATUS
  3755. NTAPI
  3756. KsMethodHandlerWithAllocator(
  3757.     IN PIRP Irp,
  3758.     IN ULONG MethodSetsCount,
  3759.     IN const KSMETHOD_SET* MethodSet,
  3760.     IN PFNKSALLOCATOR Allocator OPTIONAL,
  3761.     IN ULONG MethodItemSize OPTIONAL
  3762.     );
  3763.  
  3764. KSDDKAPI
  3765. BOOLEAN
  3766. NTAPI
  3767. KsFastMethodHandler(
  3768.     IN PFILE_OBJECT FileObject,
  3769.     IN PKSMETHOD Method,
  3770.     IN ULONG MethodLength,
  3771.     IN OUT PVOID Data,
  3772.     IN ULONG DataLength,
  3773.     OUT PIO_STATUS_BLOCK IoStatus,
  3774.     IN ULONG MethodSetsCount,
  3775.     IN const KSMETHOD_SET* MethodSet
  3776.     );
  3777.  
  3778. // alloc.c:
  3779.  
  3780. KSDDKAPI
  3781. NTSTATUS
  3782. NTAPI
  3783. KsCreateDefaultAllocator(
  3784.     IN PIRP Irp
  3785.     );
  3786.  
  3787. KSDDKAPI
  3788. NTSTATUS
  3789. NTAPI
  3790. KsCreateDefaultAllocatorEx(
  3791.     IN PIRP Irp,
  3792.     IN PVOID InitializeContext OPTIONAL,
  3793.     IN PFNKSDEFAULTALLOCATE DefaultAllocate OPTIONAL,
  3794.     IN PFNKSDEFAULTFREE DefaultFree OPTIONAL,
  3795.     IN PFNKSINITIALIZEALLOCATOR InitializeAllocator OPTIONAL,
  3796.     IN PFNKSDELETEALLOCATOR DeleteAllocator OPTIONAL
  3797.     );
  3798.  
  3799. KSDDKAPI
  3800. NTSTATUS
  3801. NTAPI
  3802. KsCreateAllocator(
  3803.     IN HANDLE ConnectionHandle,
  3804.     IN PKSALLOCATOR_FRAMING AllocatorFraming,
  3805.     OUT PHANDLE AllocatorHandle
  3806.     );
  3807.  
  3808. KSDDKAPI
  3809. NTSTATUS
  3810. NTAPI
  3811. KsValidateAllocatorCreateRequest(
  3812.     IN PIRP Irp,
  3813.     OUT PKSALLOCATOR_FRAMING* AllocatorFraming
  3814.     );
  3815.  
  3816. KSDDKAPI
  3817. NTSTATUS
  3818. NTAPI
  3819. KsValidateAllocatorFramingEx(
  3820.     IN PKSALLOCATOR_FRAMING_EX Framing,
  3821.     IN ULONG BufferSize,
  3822.     IN const KSALLOCATOR_FRAMING_EX *PinFraming
  3823.     );
  3824.  
  3825. // clock.c:
  3826.  
  3827. KSDDKAPI
  3828. NTSTATUS
  3829. NTAPI
  3830. KsAllocateDefaultClock(
  3831.     OUT PKSDEFAULTCLOCK* DefaultClock
  3832.     );
  3833.  
  3834. KSDDKAPI
  3835. NTSTATUS
  3836. NTAPI
  3837. KsAllocateDefaultClockEx(
  3838.     OUT PKSDEFAULTCLOCK* DefaultClock,
  3839.     IN PVOID Context OPTIONAL,
  3840.     IN PFNKSSETTIMER SetTimer OPTIONAL,
  3841.     IN PFNKSCANCELTIMER CancelTimer OPTIONAL,
  3842.     IN PFNKSCORRELATEDTIME CorrelatedTime OPTIONAL,
  3843.     IN const KSRESOLUTION* Resolution OPTIONAL,
  3844.     IN ULONG Flags
  3845.     );
  3846.  
  3847. KSDDKAPI
  3848. VOID
  3849. NTAPI
  3850. KsFreeDefaultClock(
  3851.     IN PKSDEFAULTCLOCK DefaultClock
  3852.     );
  3853.  
  3854. KSDDKAPI
  3855. NTSTATUS
  3856. NTAPI
  3857. KsCreateDefaultClock(
  3858.     IN PIRP Irp,
  3859.     IN PKSDEFAULTCLOCK DefaultClock
  3860.     );
  3861.  
  3862. KSDDKAPI
  3863. NTSTATUS
  3864. NTAPI
  3865. KsCreateClock(
  3866.     IN HANDLE ConnectionHandle,
  3867.     IN PKSCLOCK_CREATE ClockCreate,
  3868.     OUT PHANDLE ClockHandle
  3869.     );
  3870.  
  3871. KSDDKAPI
  3872. NTSTATUS
  3873. NTAPI
  3874. KsValidateClockCreateRequest(
  3875.     IN PIRP Irp,
  3876.     OUT PKSCLOCK_CREATE* ClockCreate
  3877.     );
  3878.  
  3879. KSDDKAPI
  3880. KSSTATE
  3881. NTAPI
  3882. KsGetDefaultClockState(
  3883.     IN PKSDEFAULTCLOCK DefaultClock
  3884.     );
  3885.  
  3886. KSDDKAPI
  3887. VOID
  3888. NTAPI
  3889. KsSetDefaultClockState(
  3890.     IN PKSDEFAULTCLOCK DefaultClock,
  3891.     IN KSSTATE State
  3892.     );
  3893.  
  3894. KSDDKAPI
  3895. LONGLONG
  3896. NTAPI
  3897. KsGetDefaultClockTime(
  3898.     IN PKSDEFAULTCLOCK DefaultClock
  3899.     );
  3900.  
  3901. KSDDKAPI
  3902. VOID
  3903. NTAPI
  3904. KsSetDefaultClockTime(
  3905.     IN PKSDEFAULTCLOCK DefaultClock,
  3906.     IN LONGLONG Time
  3907.     );
  3908.  
  3909. // connect.c:
  3910.  
  3911. KSDDKAPI
  3912. NTSTATUS
  3913. NTAPI
  3914. KsCreatePin(
  3915.     IN HANDLE FilterHandle,
  3916.     IN PKSPIN_CONNECT Connect,
  3917.     IN ACCESS_MASK DesiredAccess,
  3918.     OUT PHANDLE ConnectionHandle
  3919.     );
  3920.  
  3921. KSDDKAPI
  3922. NTSTATUS
  3923. NTAPI
  3924. KsValidateConnectRequest(
  3925.     IN PIRP Irp,
  3926.     IN ULONG DescriptorsCount,
  3927.     IN const KSPIN_DESCRIPTOR* Descriptor,
  3928.     OUT PKSPIN_CONNECT* Connect
  3929.     );
  3930.  
  3931. KSDDKAPI
  3932. NTSTATUS
  3933. NTAPI
  3934. KsPinPropertyHandler(
  3935.     IN PIRP Irp,
  3936.     IN PKSPROPERTY Property,
  3937.     IN OUT PVOID Data,
  3938.     IN ULONG DescriptorsCount,
  3939.     IN const KSPIN_DESCRIPTOR* Descriptor
  3940.     );
  3941.  
  3942. KSDDKAPI
  3943. NTSTATUS
  3944. NTAPI
  3945. KsPinDataIntersection(
  3946.     IN PIRP Irp,
  3947.     IN PKSP_PIN Pin,
  3948.     OUT PVOID Data OPTIONAL,
  3949.     IN ULONG DescriptorsCount,
  3950.     IN const KSPIN_DESCRIPTOR* Descriptor,
  3951.     IN PFNKSINTERSECTHANDLER IntersectHandler
  3952.     );
  3953.  
  3954. KSDDKAPI
  3955. NTSTATUS
  3956. NTAPI
  3957. KsPinDataIntersectionEx(
  3958.     IN PIRP Irp,
  3959.     IN PKSP_PIN Pin,
  3960.     OUT PVOID Data,
  3961.     IN ULONG DescriptorsCount,
  3962.     IN const KSPIN_DESCRIPTOR* Descriptor,
  3963.     IN ULONG DescriptorSize,
  3964.     IN PFNKSINTERSECTHANDLEREX IntersectHandler OPTIONAL,
  3965.     IN PVOID HandlerContext OPTIONAL
  3966.     );
  3967.  
  3968. KSDDKAPI
  3969. NTSTATUS
  3970. NTAPI
  3971. KsHandleSizedListQuery(
  3972.     IN PIRP Irp,
  3973.     IN ULONG DataItemsCount,
  3974.     IN ULONG DataItemSize,
  3975.     IN const VOID* DataItems
  3976.     );
  3977.  
  3978. // image.c:
  3979.  
  3980. #if (!defined( MAKEINTRESOURCE )) 
  3981. #define MAKEINTRESOURCE( res ) ((ULONG_PTR) (USHORT) res)
  3982. #endif
  3983.  
  3984. #if (!defined( RT_STRING ))
  3985. #define RT_STRING           MAKEINTRESOURCE( 6 )
  3986. #define RT_RCDATA           MAKEINTRESOURCE( 10 ) 
  3987. #endif
  3988.  
  3989. KSDDKAPI
  3990. NTSTATUS
  3991. NTAPI
  3992. KsLoadResource(
  3993.     IN PVOID ImageBase,
  3994.     IN POOL_TYPE PoolType,
  3995.     IN ULONG_PTR ResourceName,
  3996.     IN ULONG ResourceType,
  3997.     OUT PVOID *Resource,
  3998.     OUT PULONG ResourceSize            
  3999.     );
  4000.     
  4001. KSDDKAPI
  4002. NTSTATUS
  4003. NTAPI
  4004. KsGetImageNameAndResourceId(
  4005.     IN HANDLE RegKey,
  4006.     OUT PUNICODE_STRING ImageName,                
  4007.     OUT PULONG_PTR ResourceId,
  4008.     OUT PULONG ValueType
  4009. );
  4010.  
  4011. KSDDKAPI
  4012. NTSTATUS
  4013. NTAPI
  4014. KsMapModuleName(
  4015.     IN PDEVICE_OBJECT PhysicalDeviceObject,
  4016.     IN PUNICODE_STRING ModuleName,
  4017.     OUT PUNICODE_STRING ImageName,                
  4018.     OUT PULONG_PTR ResourceId,
  4019.     OUT PULONG ValueType
  4020.     );
  4021.     
  4022. // irp.c:
  4023.  
  4024. KSDDKAPI
  4025. NTSTATUS
  4026. NTAPI
  4027. KsReferenceBusObject(
  4028.     IN KSDEVICE_HEADER  Header
  4029.     );
  4030.  
  4031. KSDDKAPI
  4032. VOID
  4033. NTAPI
  4034. KsDereferenceBusObject(
  4035.     IN KSDEVICE_HEADER  Header
  4036.     );
  4037.  
  4038. KSDDKAPI
  4039. NTSTATUS
  4040. NTAPI
  4041. KsDispatchQuerySecurity(
  4042.     IN PDEVICE_OBJECT DeviceObject,
  4043.     IN PIRP Irp
  4044.     );
  4045.  
  4046. KSDDKAPI
  4047. NTSTATUS
  4048. NTAPI
  4049. KsDispatchSetSecurity(
  4050.     IN PDEVICE_OBJECT DeviceObject,
  4051.     IN PIRP Irp
  4052.     );
  4053.  
  4054. KSDDKAPI
  4055. NTSTATUS
  4056. NTAPI
  4057. KsDispatchSpecificProperty(
  4058.     IN PIRP Irp,
  4059.     IN PFNKSHANDLER Handler
  4060.     );
  4061.  
  4062. KSDDKAPI
  4063. NTSTATUS
  4064. NTAPI
  4065. KsDispatchSpecificMethod(
  4066.     IN PIRP Irp,
  4067.     IN PFNKSHANDLER Handler
  4068.     );
  4069.  
  4070. KSDDKAPI
  4071. NTSTATUS
  4072. NTAPI
  4073. KsReadFile(
  4074.     IN PFILE_OBJECT FileObject,
  4075.     IN PKEVENT Event OPTIONAL,
  4076.     IN PVOID PortContext OPTIONAL,
  4077.     OUT PIO_STATUS_BLOCK IoStatusBlock,
  4078.     OUT PVOID Buffer,
  4079.     IN ULONG Length,
  4080.     IN ULONG Key OPTIONAL,
  4081.     IN KPROCESSOR_MODE RequestorMode
  4082.     );
  4083.  
  4084. KSDDKAPI
  4085. NTSTATUS
  4086. NTAPI
  4087. KsWriteFile(
  4088.     IN PFILE_OBJECT FileObject,
  4089.     IN PKEVENT Event OPTIONAL,
  4090.     IN PVOID PortContext OPTIONAL,
  4091.     OUT PIO_STATUS_BLOCK IoStatusBlock,
  4092.     IN PVOID Buffer,
  4093.     IN ULONG Length,
  4094.     IN ULONG Key OPTIONAL,
  4095.     IN KPROCESSOR_MODE RequestorMode
  4096.     );
  4097.  
  4098. KSDDKAPI
  4099. NTSTATUS
  4100. NTAPI
  4101. KsQueryInformationFile(
  4102.     IN PFILE_OBJECT FileObject,
  4103.     OUT PVOID FileInformation,
  4104.     IN ULONG Length,
  4105.     IN FILE_INFORMATION_CLASS FileInformationClass
  4106.     );
  4107.  
  4108. KSDDKAPI
  4109. NTSTATUS
  4110. NTAPI
  4111. KsSetInformationFile(
  4112.     IN PFILE_OBJECT FileObject,
  4113.     IN PVOID FileInformation,
  4114.     IN ULONG Length,
  4115.     IN FILE_INFORMATION_CLASS FileInformationClass
  4116.     );
  4117.  
  4118. KSDDKAPI
  4119. NTSTATUS
  4120. NTAPI
  4121. KsStreamIo(
  4122.     IN PFILE_OBJECT FileObject,
  4123.     IN PKEVENT Event OPTIONAL,
  4124.     IN PVOID PortContext OPTIONAL,
  4125.     IN PIO_COMPLETION_ROUTINE CompletionRoutine OPTIONAL,
  4126.     IN PVOID CompletionContext OPTIONAL,
  4127.     IN KSCOMPLETION_INVOCATION CompletionInvocationFlags OPTIONAL,
  4128.     OUT PIO_STATUS_BLOCK IoStatusBlock,
  4129.     IN OUT PVOID StreamHeaders,
  4130.     IN ULONG Length,
  4131.     IN ULONG Flags,
  4132.     IN KPROCESSOR_MODE RequestorMode
  4133.     );
  4134.  
  4135. KSDDKAPI
  4136. NTSTATUS
  4137. NTAPI
  4138. KsProbeStreamIrp(
  4139.     IN OUT PIRP Irp,
  4140.     IN ULONG ProbeFlags,
  4141.     IN ULONG HeaderSize OPTIONAL
  4142.     );
  4143.  
  4144. KSDDKAPI
  4145. NTSTATUS
  4146. NTAPI
  4147. KsAllocateExtraData(
  4148.     IN OUT PIRP Irp,
  4149.     IN ULONG ExtraSize,
  4150.     OUT PVOID* ExtraBuffer
  4151.     );
  4152.  
  4153. KSDDKAPI
  4154. VOID
  4155. NTAPI
  4156. KsNullDriverUnload(
  4157.     IN PDRIVER_OBJECT DriverObject
  4158.     );
  4159.  
  4160. KSDDKAPI
  4161. NTSTATUS
  4162. NTAPI
  4163. KsSetMajorFunctionHandler(
  4164.     IN PDRIVER_OBJECT DriverObject,
  4165.     IN ULONG MajorFunction
  4166.     );
  4167.  
  4168. KSDDKAPI
  4169. NTSTATUS
  4170. NTAPI
  4171. KsDispatchInvalidDeviceRequest(
  4172.     IN PDEVICE_OBJECT DeviceObject,
  4173.     IN PIRP Irp
  4174.     );
  4175.  
  4176. KSDDKAPI
  4177. NTSTATUS
  4178. NTAPI
  4179. KsDefaultDeviceIoCompletion(
  4180.     IN PDEVICE_OBJECT DeviceObject,
  4181.     IN PIRP Irp
  4182.     );
  4183.  
  4184. KSDDKAPI
  4185. NTSTATUS
  4186. NTAPI
  4187. KsDispatchIrp(
  4188.     IN PDEVICE_OBJECT DeviceObject,
  4189.     IN PIRP Irp
  4190.     );
  4191.  
  4192. KSDDKAPI
  4193. BOOLEAN
  4194. NTAPI
  4195. KsDispatchFastIoDeviceControlFailure(
  4196.     IN PFILE_OBJECT FileObject,
  4197.     IN BOOLEAN Wait,
  4198.     IN PVOID InputBuffer OPTIONAL,
  4199.     IN ULONG InputBufferLength,
  4200.     OUT PVOID OutputBuffer OPTIONAL,
  4201.     IN ULONG OutputBufferLength,
  4202.     IN ULONG IoControlCode,
  4203.     OUT PIO_STATUS_BLOCK IoStatus,
  4204.     IN PDEVICE_OBJECT DeviceObject
  4205.     );
  4206.  
  4207. KSDDKAPI
  4208. BOOLEAN
  4209. NTAPI
  4210. KsDispatchFastReadFailure(
  4211.     IN PFILE_OBJECT FileObject,
  4212.     IN PLARGE_INTEGER FileOffset,
  4213.     IN ULONG Length,
  4214.     IN BOOLEAN Wait,
  4215.     IN ULONG LockKey,
  4216.     OUT PVOID Buffer,
  4217.     OUT PIO_STATUS_BLOCK IoStatus,
  4218.     IN PDEVICE_OBJECT DeviceObject
  4219.     );
  4220.  
  4221. #define KsDispatchFastWriteFailure KsDispatchFastReadFailure
  4222.  
  4223. KSDDKAPI
  4224. VOID
  4225. NTAPI
  4226. KsCancelRoutine(
  4227.     IN PDEVICE_OBJECT DeviceObject,
  4228.     IN PIRP Irp
  4229.     );
  4230.  
  4231. KSDDKAPI
  4232. VOID
  4233. NTAPI
  4234. KsCancelIo(   
  4235.     IN OUT PLIST_ENTRY  QueueHead,
  4236.     IN PKSPIN_LOCK SpinLock
  4237.     );
  4238.  
  4239. KSDDKAPI
  4240. VOID
  4241. NTAPI
  4242. KsReleaseIrpOnCancelableQueue(
  4243.     IN PIRP Irp,
  4244.     IN PDRIVER_CANCEL DriverCancel OPTIONAL
  4245.     );
  4246.  
  4247. KSDDKAPI
  4248. PIRP
  4249. NTAPI
  4250. KsRemoveIrpFromCancelableQueue(
  4251.     IN OUT PLIST_ENTRY QueueHead,
  4252.     IN PKSPIN_LOCK SpinLock,
  4253.     IN KSLIST_ENTRY_LOCATION ListLocation,
  4254.     IN KSIRP_REMOVAL_OPERATION RemovalOperation
  4255.     );
  4256.  
  4257. KSDDKAPI
  4258. NTSTATUS
  4259. NTAPI
  4260. KsMoveIrpsOnCancelableQueue(
  4261.     IN OUT PLIST_ENTRY SourceList,
  4262.     IN PKSPIN_LOCK SourceLock,
  4263.     IN OUT PLIST_ENTRY DestinationList,
  4264.     IN PKSPIN_LOCK DestinationLock OPTIONAL,
  4265.     IN KSLIST_ENTRY_LOCATION ListLocation,
  4266.     IN PFNKSIRPLISTCALLBACK ListCallback,
  4267.     IN PVOID Context
  4268.     );
  4269.  
  4270. KSDDKAPI
  4271. VOID
  4272. NTAPI
  4273. KsRemoveSpecificIrpFromCancelableQueue(
  4274.     IN PIRP Irp
  4275.     );
  4276.  
  4277. KSDDKAPI
  4278. VOID
  4279. NTAPI
  4280. KsAddIrpToCancelableQueue(
  4281.     IN OUT PLIST_ENTRY QueueHead,
  4282.     IN PKSPIN_LOCK SpinLock,
  4283.     IN PIRP Irp,
  4284.     IN KSLIST_ENTRY_LOCATION ListLocation,
  4285.     IN PDRIVER_CANCEL DriverCancel OPTIONAL
  4286.     );
  4287.  
  4288. // api.c:
  4289.  
  4290. KSDDKAPI
  4291. NTSTATUS
  4292. NTAPI
  4293. KsAcquireResetValue(
  4294.     IN PIRP Irp,
  4295.     OUT KSRESET* ResetValue
  4296.     );
  4297.  
  4298. KSDDKAPI
  4299. NTSTATUS
  4300. NTAPI
  4301. KsTopologyPropertyHandler(
  4302.     IN PIRP Irp,
  4303.     IN PKSPROPERTY Property,
  4304.     IN OUT PVOID Data,
  4305.     IN const KSTOPOLOGY* Topology
  4306.     );
  4307.  
  4308. KSDDKAPI
  4309. VOID
  4310. NTAPI
  4311. KsAcquireDeviceSecurityLock(
  4312.     IN KSDEVICE_HEADER Header,
  4313.     IN BOOLEAN Exclusive
  4314.     );
  4315.  
  4316. KSDDKAPI
  4317. VOID
  4318. NTAPI
  4319. KsReleaseDeviceSecurityLock(
  4320.     IN KSDEVICE_HEADER Header
  4321.     );
  4322.     
  4323. KSDDKAPI
  4324. NTSTATUS
  4325. NTAPI
  4326. KsDefaultDispatchPnp(
  4327.     IN PDEVICE_OBJECT DeviceObject,
  4328.     IN PIRP Irp
  4329.     );
  4330.  
  4331. KSDDKAPI
  4332. NTSTATUS
  4333. NTAPI
  4334. KsDefaultDispatchPower(
  4335.     IN PDEVICE_OBJECT DeviceObject,
  4336.     IN PIRP Irp
  4337.     );
  4338.     
  4339. KSDDKAPI
  4340. NTSTATUS
  4341. NTAPI
  4342. KsDefaultForwardIrp(
  4343.     IN PDEVICE_OBJECT DeviceObject,
  4344.     IN PIRP Irp
  4345.     );
  4346.  
  4347. KSDDKAPI
  4348. VOID
  4349. NTAPI
  4350. KsSetDevicePnpAndBaseObject(
  4351.     IN KSDEVICE_HEADER Header,
  4352.     IN PDEVICE_OBJECT PnpDeviceObject,
  4353.     IN PDEVICE_OBJECT BaseObject
  4354.     );
  4355.  
  4356. KSDDKAPI
  4357. PDEVICE_OBJECT
  4358. NTAPI
  4359. KsQueryDevicePnpObject(
  4360.     IN KSDEVICE_HEADER Header
  4361.     );
  4362.  
  4363. KSDDKAPI
  4364. ACCESS_MASK
  4365. NTAPI
  4366. KsQueryObjectAccessMask(
  4367.     IN KSOBJECT_HEADER Header
  4368.     );
  4369.  
  4370. KSDDKAPI
  4371. VOID
  4372. NTAPI
  4373. KsRecalculateStackDepth(
  4374.     IN KSDEVICE_HEADER Header,
  4375.     IN BOOLEAN ReuseStackLocation
  4376.     );
  4377.  
  4378. KSDDKAPI
  4379. VOID
  4380. NTAPI
  4381. KsSetTargetState(
  4382.     IN KSOBJECT_HEADER Header,
  4383.     IN KSTARGET_STATE TargetState
  4384.     );
  4385.  
  4386. KSDDKAPI
  4387. VOID
  4388. NTAPI
  4389. KsSetTargetDeviceObject(
  4390.     IN KSOBJECT_HEADER Header,
  4391.     IN PDEVICE_OBJECT TargetDevice OPTIONAL
  4392.     );
  4393.  
  4394. KSDDKAPI
  4395. VOID
  4396. NTAPI
  4397. KsSetPowerDispatch(
  4398.     IN KSOBJECT_HEADER Header,
  4399.     IN PFNKSCONTEXT_DISPATCH PowerDispatch OPTIONAL,
  4400.     IN PVOID PowerContext OPTIONAL
  4401.     );
  4402.  
  4403. KSDDKAPI
  4404. PKSOBJECT_CREATE_ITEM
  4405. NTAPI
  4406. KsQueryObjectCreateItem(
  4407.     IN KSOBJECT_HEADER Header
  4408.     );
  4409.  
  4410. KSDDKAPI
  4411. NTSTATUS
  4412. NTAPI
  4413. KsAllocateDeviceHeader(
  4414.     OUT KSDEVICE_HEADER* Header,
  4415.     IN ULONG ItemsCount,
  4416.     IN PKSOBJECT_CREATE_ITEM ItemsList OPTIONAL
  4417.     );
  4418.  
  4419. KSDDKAPI
  4420. VOID
  4421. NTAPI
  4422. KsFreeDeviceHeader(
  4423.     IN KSDEVICE_HEADER Header
  4424.     );
  4425.  
  4426. KSDDKAPI
  4427. NTSTATUS
  4428. NTAPI
  4429. KsAllocateObjectHeader(
  4430.     OUT KSOBJECT_HEADER* Header,
  4431.     IN ULONG ItemsCount,
  4432.     IN PKSOBJECT_CREATE_ITEM ItemsList OPTIONAL,
  4433.     IN PIRP Irp,
  4434.     IN const KSDISPATCH_TABLE* Table
  4435.     );
  4436.  
  4437. KSDDKAPI
  4438. VOID
  4439. NTAPI
  4440. KsFreeObjectHeader(
  4441.     IN KSOBJECT_HEADER Header
  4442.     );
  4443.  
  4444. KSDDKAPI
  4445. NTSTATUS
  4446. NTAPI
  4447. KsAddObjectCreateItemToDeviceHeader(
  4448.     IN KSDEVICE_HEADER Header,
  4449.     IN PDRIVER_DISPATCH Create,
  4450.     IN PVOID Context,
  4451.     IN PWCHAR ObjectClass,
  4452.     IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL
  4453.     );
  4454.  
  4455. KSDDKAPI
  4456. NTSTATUS
  4457. NTAPI
  4458. KsAddObjectCreateItemToObjectHeader(
  4459.     IN KSOBJECT_HEADER Header,
  4460.     IN PDRIVER_DISPATCH Create,
  4461.     IN PVOID Context,
  4462.     IN PWCHAR ObjectClass,
  4463.     IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL
  4464.     );
  4465.  
  4466. KSDDKAPI
  4467. NTSTATUS
  4468. NTAPI
  4469. KsAllocateObjectCreateItem(
  4470.     IN KSDEVICE_HEADER Header,
  4471.     IN PKSOBJECT_CREATE_ITEM CreateItem,
  4472.     IN BOOLEAN AllocateEntry,
  4473.     IN PFNKSITEMFREECALLBACK ItemFreeCallback OPTIONAL
  4474.     );
  4475.  
  4476. KSDDKAPI
  4477. NTSTATUS
  4478. NTAPI
  4479. KsFreeObjectCreateItem(
  4480.     IN KSDEVICE_HEADER Header,
  4481.     IN PUNICODE_STRING CreateItem
  4482.     );
  4483.  
  4484. KSDDKAPI
  4485. NTSTATUS
  4486. NTAPI
  4487. KsFreeObjectCreateItemsByContext(
  4488.     IN KSDEVICE_HEADER Header,
  4489.     IN PVOID Context
  4490.     );
  4491.  
  4492. KSDDKAPI
  4493. NTSTATUS
  4494. NTAPI
  4495. KsCreateDefaultSecurity(
  4496.     IN PSECURITY_DESCRIPTOR ParentSecurity OPTIONAL,
  4497.     OUT PSECURITY_DESCRIPTOR* DefaultSecurity
  4498.     );
  4499.  
  4500. KSDDKAPI
  4501. NTSTATUS
  4502. NTAPI
  4503. KsForwardIrp(
  4504.     IN PIRP Irp,
  4505.     IN PFILE_OBJECT FileObject,
  4506.     IN BOOLEAN ReuseStackLocation
  4507.     );
  4508.  
  4509. KSDDKAPI
  4510. NTSTATUS
  4511. NTAPI
  4512. KsForwardAndCatchIrp(
  4513.     IN PDEVICE_OBJECT DeviceObject,
  4514.     IN PIRP Irp,
  4515.     IN PFILE_OBJECT FileObject,
  4516.     IN KSSTACK_USE StackUse
  4517.     );
  4518.  
  4519. KSDDKAPI
  4520. NTSTATUS
  4521. NTAPI
  4522. KsSynchronousIoControlDevice(
  4523.     IN PFILE_OBJECT FileObject,
  4524.     IN KPROCESSOR_MODE RequestorMode,
  4525.     IN ULONG IoControl,
  4526.     IN PVOID InBuffer,
  4527.     IN ULONG InSize,
  4528.     OUT PVOID OutBuffer,
  4529.     IN ULONG OutSize,
  4530.     OUT PULONG BytesReturned
  4531.     );
  4532.  
  4533. KSDDKAPI
  4534. NTSTATUS
  4535. NTAPI
  4536. KsUnserializeObjectPropertiesFromRegistry(
  4537.     IN PFILE_OBJECT FileObject,
  4538.     IN HANDLE ParentKey OPTIONAL,
  4539.     IN PUNICODE_STRING RegistryPath OPTIONAL
  4540.     );
  4541.  
  4542. KSDDKAPI
  4543. NTSTATUS
  4544. NTAPI
  4545. KsCacheMedium(
  4546.     IN PUNICODE_STRING SymbolicLink,
  4547.     IN PKSPIN_MEDIUM Medium,
  4548.     IN ULONG PinDirection
  4549.     );
  4550.  
  4551. // thread.c:
  4552.  
  4553. KSDDKAPI
  4554. NTSTATUS
  4555. NTAPI
  4556. KsRegisterWorker(
  4557.     IN WORK_QUEUE_TYPE WorkQueueType,
  4558.     OUT PKSWORKER* Worker
  4559.     );
  4560. KSDDKAPI
  4561. NTSTATUS
  4562. NTAPI
  4563. KsRegisterCountedWorker(
  4564.     IN WORK_QUEUE_TYPE WorkQueueType,
  4565.     IN PWORK_QUEUE_ITEM CountedWorkItem,
  4566.     OUT PKSWORKER* Worker
  4567.     );
  4568. KSDDKAPI
  4569. VOID
  4570. NTAPI
  4571. KsUnregisterWorker(
  4572.     IN PKSWORKER Worker
  4573.     );
  4574. KSDDKAPI
  4575. NTSTATUS
  4576. NTAPI
  4577. KsQueueWorkItem(
  4578.     IN PKSWORKER Worker,
  4579.     IN PWORK_QUEUE_ITEM WorkItem
  4580.     );
  4581. KSDDKAPI
  4582. ULONG
  4583. NTAPI
  4584. KsIncrementCountedWorker(
  4585.     IN PKSWORKER Worker
  4586.     );
  4587. KSDDKAPI
  4588. ULONG
  4589. NTAPI
  4590. KsDecrementCountedWorker(
  4591.     IN PKSWORKER Worker
  4592.     );
  4593.  
  4594. // topology.c:
  4595.  
  4596. KSDDKAPI
  4597. NTSTATUS
  4598. NTAPI
  4599. KsCreateTopologyNode(
  4600.     IN HANDLE ParentHandle,
  4601.     IN PKSNODE_CREATE NodeCreate,
  4602.     IN ACCESS_MASK DesiredAccess,
  4603.     OUT PHANDLE NodeHandle
  4604.     );
  4605.  
  4606. KSDDKAPI
  4607. NTSTATUS
  4608. NTAPI
  4609. KsValidateTopologyNodeCreateRequest(
  4610.     IN PIRP Irp,
  4611.     IN PKSTOPOLOGY Topology,
  4612.     OUT PKSNODE_CREATE* NodeCreate
  4613.     );
  4614.  
  4615. KSDDKAPI
  4616. NTSTATUS
  4617. NTAPI
  4618. KsMergeAutomationTables(
  4619.     OUT PKSAUTOMATION_TABLE* AutomationTableAB,
  4620.     IN PKSAUTOMATION_TABLE AutomationTableA OPTIONAL,
  4621.     IN PKSAUTOMATION_TABLE AutomationTableB OPTIONAL,
  4622.     IN KSOBJECT_BAG Bag OPTIONAL
  4623.     );
  4624.  
  4625. KSDDKAPI
  4626. NTSTATUS
  4627. NTAPI
  4628. KsInitializeDriver(
  4629.     IN PDRIVER_OBJECT DriverObject,
  4630.     IN PUNICODE_STRING RegistryPathName,
  4631.     IN const KSDEVICE_DESCRIPTOR* Descriptor OPTIONAL
  4632.     );
  4633.  
  4634. KSDDKAPI
  4635. NTSTATUS
  4636. NTAPI
  4637. KsAddDevice(
  4638.     IN PDRIVER_OBJECT DriverObject,
  4639.     IN PDEVICE_OBJECT PhysicalDeviceObject
  4640.     );
  4641.  
  4642. KSDDKAPI
  4643. NTSTATUS
  4644. NTAPI
  4645. KsCreateDevice(
  4646.     IN PDRIVER_OBJECT DriverObject,
  4647.     IN PDEVICE_OBJECT PhysicalDeviceObject,
  4648.     IN const KSDEVICE_DESCRIPTOR* Descriptor OPTIONAL,
  4649.     IN ULONG ExtensionSize OPTIONAL,
  4650.     OUT PKSDEVICE* Device OPTIONAL
  4651.     );
  4652.  
  4653. KSDDKAPI
  4654. NTSTATUS
  4655. NTAPI
  4656. KsInitializeDevice(
  4657.     IN PDEVICE_OBJECT FunctionalDeviceObject,
  4658.     IN PDEVICE_OBJECT PhysicalDeviceObject,
  4659.     IN PDEVICE_OBJECT NextDeviceObject,
  4660.     IN const KSDEVICE_DESCRIPTOR* Descriptor OPTIONAL
  4661.     );
  4662.  
  4663. KSDDKAPI
  4664. void
  4665. NTAPI
  4666. KsTerminateDevice(
  4667.     IN PDEVICE_OBJECT DeviceObject
  4668.     );
  4669.  
  4670. KSDDKAPI
  4671. PKSDEVICE
  4672. NTAPI
  4673. KsGetDeviceForDeviceObject(
  4674.     IN PDEVICE_OBJECT FunctionalDeviceObject
  4675.     );
  4676.  
  4677. KSDDKAPI
  4678. void
  4679. NTAPI
  4680. KsAcquireDevice(
  4681.     IN PKSDEVICE Device
  4682.     );
  4683.  
  4684. KSDDKAPI
  4685. void
  4686. NTAPI
  4687. KsReleaseDevice(
  4688.     IN PKSDEVICE Device
  4689.     );
  4690.  
  4691. KSDDKAPI
  4692. void
  4693. NTAPI
  4694. KsDeviceRegisterAdapterObject(
  4695.     IN PKSDEVICE Device,
  4696.     IN PADAPTER_OBJECT AdapterObject,
  4697.     IN ULONG MaxMappingsByteCount,
  4698.     IN ULONG MappingTableStride
  4699.     );
  4700.  
  4701. KSDDKAPI
  4702. ULONG
  4703. NTAPI
  4704. KsDeviceGetBusData(
  4705.     IN PKSDEVICE Device,
  4706.     IN ULONG DataType,
  4707.     IN PVOID Buffer,
  4708.     IN ULONG Offset,
  4709.     IN ULONG Length
  4710.     );
  4711.  
  4712. KSDDKAPI
  4713. ULONG
  4714. NTAPI
  4715. KsDeviceSetBusData(
  4716.     IN PKSDEVICE Device,
  4717.     IN ULONG DataType,
  4718.     IN PVOID Buffer,
  4719.     IN ULONG Offset,
  4720.     IN ULONG Length
  4721.     );
  4722.  
  4723. KSDDKAPI
  4724. NTSTATUS
  4725. NTAPI
  4726. KsCreateFilterFactory(
  4727.     IN PDEVICE_OBJECT DeviceObject,
  4728.     IN const KSFILTER_DESCRIPTOR* Descriptor,
  4729.     IN PWCHAR RefString OPTIONAL,
  4730.     IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL,
  4731.     IN ULONG CreateItemFlags,
  4732.     IN PFNKSFILTERFACTORYPOWER SleepCallback OPTIONAL,
  4733.     IN PFNKSFILTERFACTORYPOWER WakeCallback OPTIONAL,
  4734.     OUT PKSFILTERFACTORY* FilterFactory OPTIONAL
  4735.     );
  4736.  
  4737. #define KsDeleteFilterFactory(FilterFactory) \
  4738.     KsFreeObjectCreateItemsByContext(\
  4739.         *(KSDEVICE_HEADER *)(\
  4740.             KsFilterFactoryGetParentDevice(FilterFactory)->FunctionalDeviceObject->\
  4741.                 DeviceExtension),\
  4742.         FilterFactory)
  4743.  
  4744. KSDDKAPI
  4745. NTSTATUS
  4746. NTAPI
  4747. KsFilterFactoryUpdateCacheData(
  4748.     IN PKSFILTERFACTORY FilterFactory,
  4749.     IN const KSFILTER_DESCRIPTOR *FilterDescriptor OPTIONAL
  4750.     );
  4751.  
  4752. KSDDKAPI
  4753. NTSTATUS
  4754. NTAPI
  4755. KsFilterFactoryAddCreateItem(
  4756.     IN PKSFILTERFACTORY FilterFactory,
  4757.     IN PWCHAR RefString,
  4758.     IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL,
  4759.     IN ULONG CreateItemFlags
  4760.     );
  4761.  
  4762. KSDDKAPI
  4763. NTSTATUS
  4764. NTAPI
  4765. KsFilterFactorySetDeviceClassesState(
  4766.     IN PKSFILTERFACTORY FilterFactory,
  4767.     IN BOOLEAN NewState
  4768.     );
  4769.  
  4770. KSDDKAPI
  4771. PUNICODE_STRING
  4772. NTAPI
  4773. KsFilterFactoryGetSymbolicLink(
  4774.     IN PKSFILTERFACTORY FilterFactory
  4775.     );
  4776.  
  4777. KSDDKAPI
  4778. void
  4779. NTAPI
  4780. KsAddEvent(
  4781.     IN PVOID Object,
  4782.     IN PKSEVENT_ENTRY EventEntry
  4783.     );
  4784.  
  4785. void _inline
  4786. KsFilterAddEvent(
  4787.     IN PKSFILTER Filter,
  4788.     IN PKSEVENT_ENTRY EventEntry
  4789.     )
  4790. {
  4791.     KsAddEvent(Filter,EventEntry);
  4792. }
  4793.  
  4794. void _inline
  4795. KsPinAddEvent(
  4796.     IN PKSPIN Pin,
  4797.     IN PKSEVENT_ENTRY EventEntry
  4798.     )
  4799. {
  4800.     KsAddEvent(Pin,EventEntry);
  4801. }
  4802.  
  4803. KSDDKAPI
  4804. NTSTATUS    
  4805. NTAPI
  4806. KsDefaultAddEventHandler(
  4807.     IN PIRP Irp,
  4808.     IN PKSEVENTDATA EventData,
  4809.     IN OUT PKSEVENT_ENTRY EventEntry
  4810.     );
  4811.  
  4812. KSDDKAPI
  4813. void
  4814. NTAPI
  4815. KsGenerateEvents(
  4816.     IN PVOID Object,
  4817.     IN const GUID* EventSet OPTIONAL,
  4818.     IN ULONG EventId,
  4819.     IN ULONG DataSize,
  4820.     IN PVOID Data OPTIONAL,
  4821.     IN PFNKSGENERATEEVENTCALLBACK CallBack OPTIONAL,
  4822.     IN PVOID CallBackContext OPTIONAL
  4823.     );
  4824.  
  4825. void _inline
  4826. KsFilterGenerateEvents(
  4827.     IN PKSFILTER Filter,
  4828.     IN const GUID* EventSet OPTIONAL,
  4829.     IN ULONG EventId,
  4830.     IN ULONG DataSize,
  4831.     IN PVOID Data OPTIONAL,
  4832.     IN PFNKSGENERATEEVENTCALLBACK CallBack OPTIONAL,
  4833.     IN PVOID CallBackContext OPTIONAL
  4834.     )
  4835. {
  4836.     KsGenerateEvents(
  4837.         Filter,
  4838.         EventSet,
  4839.         EventId,
  4840.         DataSize,
  4841.         Data,
  4842.         CallBack,
  4843.         CallBackContext);
  4844. }
  4845.  
  4846. void _inline
  4847. KsPinGenerateEvents(
  4848.     IN PKSPIN Pin,
  4849.     IN const GUID* EventSet OPTIONAL,
  4850.     IN ULONG EventId,
  4851.     IN ULONG DataSize,
  4852.     IN PVOID Data OPTIONAL,
  4853.     IN PFNKSGENERATEEVENTCALLBACK CallBack OPTIONAL,
  4854.     IN PVOID CallBackContext OPTIONAL
  4855.     )
  4856. {
  4857.     KsGenerateEvents(
  4858.         Pin,
  4859.         EventSet,
  4860.         EventId,
  4861.         DataSize,
  4862.         Data,
  4863.         CallBack,
  4864.         CallBackContext);
  4865. }
  4866.  
  4867. typedef enum {
  4868.     KSSTREAM_POINTER_STATE_UNLOCKED = 0,
  4869.     KSSTREAM_POINTER_STATE_LOCKED
  4870. } KSSTREAM_POINTER_STATE;
  4871.  
  4872. KSDDKAPI
  4873. NTSTATUS
  4874. NTAPI
  4875. KsPinGetAvailableByteCount(
  4876.     IN PKSPIN Pin,
  4877.     OUT PLONG InputDataBytes OPTIONAL,
  4878.     OUT PLONG OutputBufferBytes OPTIONAL
  4879.     );
  4880.  
  4881. KSDDKAPI
  4882. PKSSTREAM_POINTER
  4883. NTAPI
  4884. KsPinGetLeadingEdgeStreamPointer(
  4885.     IN PKSPIN Pin,
  4886.     IN KSSTREAM_POINTER_STATE State
  4887.     );
  4888.  
  4889. KSDDKAPI
  4890. PKSSTREAM_POINTER
  4891. NTAPI
  4892. KsPinGetTrailingEdgeStreamPointer(
  4893.     IN PKSPIN Pin,
  4894.     IN KSSTREAM_POINTER_STATE State
  4895.     );
  4896.  
  4897. KSDDKAPI
  4898. NTSTATUS
  4899. NTAPI
  4900. KsStreamPointerSetStatusCode(
  4901.     IN PKSSTREAM_POINTER StreamPointer,
  4902.     IN NTSTATUS Status
  4903.     );
  4904.  
  4905. KSDDKAPI
  4906. NTSTATUS
  4907. NTAPI
  4908. KsStreamPointerLock(
  4909.     IN PKSSTREAM_POINTER StreamPointer
  4910.     );
  4911.  
  4912. KSDDKAPI
  4913. void
  4914. NTAPI
  4915. KsStreamPointerUnlock(
  4916.     IN PKSSTREAM_POINTER StreamPointer,
  4917.     IN BOOLEAN Eject
  4918.     );
  4919.  
  4920. KSDDKAPI
  4921. void
  4922. NTAPI
  4923. KsStreamPointerAdvanceOffsetsAndUnlock(
  4924.     IN PKSSTREAM_POINTER StreamPointer,
  4925.     IN ULONG InUsed,
  4926.     IN ULONG OutUsed,
  4927.     IN BOOLEAN Eject
  4928.     );
  4929.  
  4930. KSDDKAPI
  4931. void
  4932. NTAPI
  4933. KsStreamPointerDelete(
  4934.     IN PKSSTREAM_POINTER StreamPointer
  4935.     );
  4936.  
  4937. KSDDKAPI
  4938. NTSTATUS
  4939. NTAPI
  4940. KsStreamPointerClone(
  4941.     IN PKSSTREAM_POINTER StreamPointer,
  4942.     IN PFNKSSTREAMPOINTER CancelCallback OPTIONAL,
  4943.     IN ULONG ContextSize,
  4944.     OUT PKSSTREAM_POINTER* CloneStreamPointer
  4945.     );
  4946.  
  4947. KSDDKAPI
  4948. NTSTATUS
  4949. NTAPI
  4950. KsStreamPointerAdvanceOffsets(
  4951.     IN PKSSTREAM_POINTER StreamPointer,
  4952.     IN ULONG InUsed,
  4953.     IN ULONG OutUsed,
  4954.     IN BOOLEAN Eject
  4955.     );
  4956.  
  4957. KSDDKAPI
  4958. NTSTATUS
  4959. NTAPI
  4960. KsStreamPointerAdvance(
  4961.     IN PKSSTREAM_POINTER StreamPointer
  4962.     );
  4963.  
  4964. KSDDKAPI
  4965. PMDL
  4966. NTAPI
  4967. KsStreamPointerGetMdl(
  4968.     IN PKSSTREAM_POINTER StreamPointer
  4969.     );
  4970.  
  4971. KSDDKAPI
  4972. PIRP
  4973. NTAPI
  4974. KsStreamPointerGetIrp(
  4975.     IN PKSSTREAM_POINTER StreamPointer,
  4976.     OUT PBOOLEAN FirstFrameInIrp OPTIONAL,
  4977.     OUT PBOOLEAN LastFrameInIrp OPTIONAL
  4978.     );
  4979.  
  4980. KSDDKAPI
  4981. void
  4982. NTAPI
  4983. KsStreamPointerScheduleTimeout(
  4984.     IN PKSSTREAM_POINTER StreamPointer,
  4985.     IN PFNKSSTREAMPOINTER Callback,
  4986.     IN ULONGLONG Interval
  4987.     );
  4988.  
  4989. KSDDKAPI
  4990. void
  4991. NTAPI
  4992. KsStreamPointerCancelTimeout(
  4993.     IN PKSSTREAM_POINTER StreamPointer
  4994.     );
  4995.  
  4996. KSDDKAPI
  4997. PKSSTREAM_POINTER
  4998. NTAPI
  4999. KsPinGetFirstCloneStreamPointer(
  5000.     IN PKSPIN Pin
  5001.     );
  5002.  
  5003. KSDDKAPI
  5004. PKSSTREAM_POINTER
  5005. NTAPI
  5006. KsStreamPointerGetNextClone(
  5007.     IN PKSSTREAM_POINTER StreamPointer
  5008.     );
  5009.  
  5010. KSDDKAPI
  5011. NTSTATUS
  5012. NTAPI
  5013. KsPinHandshake(
  5014.     IN PKSPIN Pin,
  5015.     IN PKSHANDSHAKE In,
  5016.     OUT PKSHANDSHAKE Out
  5017.     );
  5018.  
  5019. KSDDKAPI
  5020. void
  5021. NTAPI
  5022. KsCompletePendingRequest(
  5023.     IN PIRP Irp
  5024.     );
  5025.  
  5026. KSDDKAPI
  5027. KSOBJECTTYPE
  5028. NTAPI
  5029. KsGetObjectTypeFromIrp(
  5030.     IN PIRP Irp
  5031.     );
  5032.  
  5033. KSDDKAPI
  5034. PVOID
  5035. NTAPI
  5036. KsGetObjectFromFileObject(
  5037.     IN PFILE_OBJECT FileObject
  5038.     );
  5039.  
  5040. KSDDKAPI
  5041. KSOBJECTTYPE
  5042. NTAPI
  5043. KsGetObjectTypeFromFileObject(
  5044.     IN PFILE_OBJECT FileObject
  5045.     );
  5046.  
  5047. PKSFILTER __inline
  5048. KsGetFilterFromFileObject(
  5049.     IN PFILE_OBJECT FileObject
  5050.     )
  5051. {
  5052.     return (PKSFILTER) KsGetObjectFromFileObject(FileObject);
  5053. }
  5054.  
  5055. PKSPIN __inline
  5056. KsGetPinFromFileObject(
  5057.     IN PFILE_OBJECT FileObject
  5058.     )
  5059. {
  5060.     return (PKSPIN) KsGetObjectFromFileObject(FileObject);
  5061. }    
  5062.  
  5063. KSDDKAPI
  5064. PKSGATE
  5065. NTAPI
  5066. KsFilterGetAndGate(
  5067.     IN PKSFILTER Filter
  5068.     );
  5069.  
  5070. KSDDKAPI
  5071. void
  5072. NTAPI
  5073. KsFilterAcquireProcessingMutex(
  5074.     IN PKSFILTER Filter
  5075.     );
  5076.  
  5077. KSDDKAPI
  5078. void
  5079. NTAPI
  5080. KsFilterReleaseProcessingMutex(
  5081.     IN PKSFILTER Filter
  5082.     );
  5083.  
  5084. KSDDKAPI
  5085. void
  5086. NTAPI
  5087. KsFilterAttemptProcessing(
  5088.     IN PKSFILTER Filter,
  5089.     IN BOOLEAN Asynchronous
  5090.     );
  5091.  
  5092. KSDDKAPI
  5093. PKSGATE
  5094. NTAPI
  5095. KsPinGetAndGate(
  5096.     IN PKSPIN Pin
  5097.     );
  5098.  
  5099. KSDDKAPI
  5100. void
  5101. NTAPI
  5102. KsPinAttachAndGate(
  5103.     IN PKSPIN Pin,
  5104.     IN PKSGATE AndGate OPTIONAL
  5105.     );
  5106.  
  5107. KSDDKAPI
  5108. void
  5109. NTAPI
  5110. KsPinAttachOrGate(
  5111.     IN PKSPIN Pin,
  5112.     IN PKSGATE OrGate OPTIONAL
  5113.     );
  5114.  
  5115. KSDDKAPI
  5116. void
  5117. NTAPI
  5118. KsPinAcquireProcessingMutex(
  5119.     IN PKSPIN Pin
  5120.     );
  5121.  
  5122. KSDDKAPI
  5123. void
  5124. NTAPI
  5125. KsPinReleaseProcessingMutex(
  5126.     IN PKSPIN Pin
  5127.     );
  5128.  
  5129. KSDDKAPI
  5130. BOOLEAN
  5131. NTAPI
  5132. KsProcessPinUpdate(
  5133.     IN PKSPROCESSPIN ProcessPin
  5134.     );
  5135.  
  5136. KSDDKAPI
  5137. void
  5138. NTAPI
  5139. KsPinGetCopyRelationships(
  5140.     IN PKSPIN Pin,
  5141.     OUT PKSPIN* CopySource,
  5142.     OUT PKSPIN* DelegateBranch
  5143.     );
  5144.  
  5145. KSDDKAPI
  5146. void
  5147. NTAPI
  5148. KsPinAttemptProcessing(
  5149.     IN PKSPIN Pin,
  5150.     IN BOOLEAN Asynchronous
  5151.     );
  5152.  
  5153. KSDDKAPI
  5154. PVOID
  5155. NTAPI
  5156. KsGetParent(
  5157.     IN PVOID Object
  5158.     );
  5159.  
  5160. PKSDEVICE __inline
  5161. KsFilterFactoryGetParentDevice(
  5162.     IN PKSFILTERFACTORY FilterFactory
  5163.     )
  5164. {
  5165.     return (PKSDEVICE) KsGetParent((PVOID) FilterFactory);
  5166. }
  5167.  
  5168. PKSFILTERFACTORY __inline
  5169. KsFilterGetParentFilterFactory(
  5170.     IN PKSFILTER Filter
  5171.     )
  5172. {
  5173.     return (PKSFILTERFACTORY) KsGetParent((PVOID) Filter);
  5174. }
  5175.  
  5176. KSDDKAPI
  5177. PKSFILTER 
  5178. NTAPI
  5179. KsPinGetParentFilter(
  5180.     IN PKSPIN Pin
  5181.     );
  5182.  
  5183. KSDDKAPI
  5184. PVOID
  5185. NTAPI
  5186. KsGetFirstChild(
  5187.     IN PVOID Object
  5188.     );
  5189.  
  5190. PKSFILTERFACTORY __inline
  5191. KsDeviceGetFirstChildFilterFactory(
  5192.     IN PKSDEVICE Device
  5193.     )
  5194. {
  5195.     return (PKSFILTERFACTORY) KsGetFirstChild((PVOID) Device);
  5196. }
  5197.  
  5198. PKSFILTER __inline
  5199. KsFilterFactoryGetFirstChildFilter(
  5200.     IN PKSFILTERFACTORY FilterFactory
  5201.     )
  5202. {
  5203.     return (PKSFILTER) KsGetFirstChild((PVOID) FilterFactory);
  5204. }
  5205.  
  5206. KSDDKAPI
  5207. ULONG
  5208. NTAPI
  5209. KsFilterGetChildPinCount(
  5210.     IN PKSFILTER Filter,
  5211.     IN ULONG PinId
  5212.     );
  5213.  
  5214. KSDDKAPI
  5215. PKSPIN
  5216. NTAPI
  5217. KsFilterGetFirstChildPin(
  5218.     IN PKSFILTER Filter,
  5219.     IN ULONG PinId
  5220.     );
  5221.  
  5222. KSDDKAPI
  5223. PVOID
  5224. NTAPI
  5225. KsGetNextSibling(
  5226.     IN PVOID Object
  5227.     );
  5228.  
  5229. KSDDKAPI
  5230. PKSPIN 
  5231. NTAPI
  5232. KsPinGetNextSiblingPin(
  5233.     IN PKSPIN Pin
  5234.     );
  5235.  
  5236. PKSFILTERFACTORY __inline
  5237. KsFilterFactoryGetNextSiblingFilterFactory(
  5238.     IN PKSFILTERFACTORY FilterFactory
  5239.     )
  5240. {
  5241.     return (PKSFILTERFACTORY) KsGetNextSibling((PVOID) FilterFactory);
  5242. }
  5243.  
  5244. PKSFILTER __inline
  5245. KsFilterGetNextSiblingFilter(
  5246.     IN PKSFILTER Filter
  5247.     )
  5248. {
  5249.     return (PKSFILTER) KsGetNextSibling((PVOID) Filter);
  5250. }
  5251.  
  5252.  
  5253. KSDDKAPI
  5254. PKSDEVICE
  5255. NTAPI
  5256. KsGetDevice(
  5257.     IN PVOID Object
  5258.     );
  5259.  
  5260. PKSDEVICE __inline
  5261. KsFilterFactoryGetDevice(
  5262.     IN PKSFILTERFACTORY FilterFactory
  5263.     )
  5264. {
  5265.     return KsGetDevice((PVOID) FilterFactory);
  5266. }
  5267.  
  5268. PKSDEVICE __inline
  5269. KsFilterGetDevice(
  5270.     IN PKSFILTER Filter
  5271.     )
  5272. {
  5273.     return KsGetDevice((PVOID) Filter);
  5274. }
  5275.  
  5276. PKSDEVICE __inline
  5277. KsPinGetDevice(
  5278.     IN PKSPIN Pin
  5279.     )
  5280. {
  5281.     return KsGetDevice((PVOID) Pin);
  5282. }
  5283.  
  5284. KSDDKAPI
  5285. PKSFILTER
  5286. NTAPI
  5287. KsGetFilterFromIrp(
  5288.     IN PIRP Irp
  5289.     );
  5290.  
  5291. KSDDKAPI
  5292. PKSPIN
  5293. NTAPI
  5294. KsGetPinFromIrp(
  5295.     IN PIRP Irp
  5296.     );
  5297.  
  5298. KSDDKAPI
  5299. ULONG
  5300. NTAPI
  5301. KsGetNodeIdFromIrp(
  5302.     IN PIRP Irp
  5303.     );
  5304.  
  5305. KSDDKAPI
  5306. void
  5307. NTAPI
  5308. KsAcquireControl(
  5309.     IN PVOID Object
  5310.     );
  5311.  
  5312. KSDDKAPI
  5313. void
  5314. NTAPI
  5315. KsReleaseControl(
  5316.     IN PVOID Object
  5317.     );
  5318.  
  5319. void __inline
  5320. KsFilterAcquireControl(
  5321.     IN PKSFILTER Filter
  5322.     )
  5323. {
  5324.     KsAcquireControl((PVOID) Filter);
  5325. }
  5326.  
  5327. void __inline
  5328. KsFilterReleaseControl(
  5329.     IN PKSFILTER Filter
  5330.     )
  5331. {
  5332.     KsReleaseControl((PVOID) Filter);
  5333. }
  5334.  
  5335. void __inline
  5336. KsPinAcquireControl(
  5337.     IN PKSPIN Pin
  5338.     )
  5339. {
  5340.     KsAcquireControl((PVOID) Pin);
  5341. }
  5342.  
  5343. void __inline
  5344. KsPinReleaseControl(
  5345.     IN PKSPIN Pin
  5346.     )
  5347. {
  5348.     KsReleaseControl((PVOID) Pin);
  5349. }
  5350.  
  5351. KSDDKAPI
  5352. NTSTATUS
  5353. NTAPI
  5354. KsAddItemToObjectBag(
  5355.     IN KSOBJECT_BAG ObjectBag,
  5356.     IN PVOID Item,
  5357.     IN PFNKSFREE Free OPTIONAL
  5358.     );
  5359.  
  5360. KSDDKAPI
  5361. ULONG
  5362. NTAPI
  5363. KsRemoveItemFromObjectBag(
  5364.     IN KSOBJECT_BAG ObjectBag,
  5365.     IN PVOID Item,
  5366.     IN BOOLEAN Free
  5367.     );
  5368.  
  5369. #define KsDiscard(Object,Pointer)\
  5370.     KsRemoveItemFromObjectBag(\
  5371.         (Object)->Bag,\
  5372.         (PVOID)(Pointer),\
  5373.         TRUE)
  5374.  
  5375. KSDDKAPI
  5376. NTSTATUS
  5377. NTAPI
  5378. KsAllocateObjectBag(
  5379.     IN PKSDEVICE Device,
  5380.     OUT KSOBJECT_BAG* ObjectBag
  5381.     );
  5382.  
  5383. KSDDKAPI
  5384. void
  5385. NTAPI
  5386. KsFreeObjectBag(
  5387.     IN KSOBJECT_BAG ObjectBag
  5388.     );
  5389.  
  5390. KSDDKAPI
  5391. NTSTATUS
  5392. NTAPI
  5393. KsCopyObjectBagItems(
  5394.     IN KSOBJECT_BAG ObjectBagDestination,
  5395.     IN KSOBJECT_BAG ObjectBagSource
  5396.     );
  5397.  
  5398. KSDDKAPI
  5399. NTSTATUS
  5400. NTAPI
  5401. _KsEdit(
  5402.     IN KSOBJECT_BAG ObjectBag,
  5403.     IN OUT PVOID* PointerToPointerToItem,
  5404.     IN ULONG NewSize,
  5405.     IN ULONG OldSize,
  5406.     IN ULONG Tag
  5407.     );
  5408.  
  5409. #define KsEdit(Object,PointerToPointer,Tag)\
  5410.     _KsEdit(\
  5411.         (Object)->Bag,\
  5412.         (PVOID*)(PointerToPointer),\
  5413.         sizeof(**(PointerToPointer)),\
  5414.         sizeof(**(PointerToPointer)),\
  5415.         (Tag))
  5416. #define KsEditSized(Object,PointerToPointer,NewSize,OldSize,Tag)\
  5417.     _KsEdit((Object)->Bag,(PVOID*)(PointerToPointer),(NewSize),(OldSize),(Tag))
  5418.  
  5419. KSDDKAPI
  5420. NTSTATUS
  5421. NTAPI
  5422. KsRegisterFilterWithNoKSPins(
  5423.                                       IN PDEVICE_OBJECT DeviceObject,
  5424.                                       IN const GUID * InterfaceClassGUID,
  5425.                                       IN ULONG PinCount,
  5426.                                       IN BOOL * PinDirection,
  5427.                                       IN KSPIN_MEDIUM * MediumList,
  5428.                                       IN OPTIONAL GUID * CategoryList
  5429. );
  5430.  
  5431. KSDDKAPI
  5432. NTSTATUS
  5433. NTAPI
  5434. KsFilterCreatePinFactory (
  5435.     IN PKSFILTER Filter,
  5436.     IN const KSPIN_DESCRIPTOR_EX *const PinDescriptor,
  5437.     OUT PULONG PinID
  5438.     );
  5439.  
  5440. KSDDKAPI
  5441. NTSTATUS
  5442. NTAPI
  5443. KsFilterCreateNode (
  5444.     IN PKSFILTER Filter,
  5445.     IN const KSNODE_DESCRIPTOR *const NodeDescriptor,
  5446.     OUT PULONG NodeID
  5447.     );
  5448.  
  5449. KSDDKAPI
  5450. NTSTATUS
  5451. NTAPI
  5452. KsFilterAddTopologyConnections (
  5453.     IN PKSFILTER Filter,
  5454.     IN ULONG NewConnectionsCount,
  5455.     IN const KSTOPOLOGY_CONNECTION *const NewTopologyConnections
  5456.     );
  5457.  
  5458. KSDDKAPI
  5459. NTSTATUS
  5460. NTAPI
  5461. KsPinGetConnectedPinInterface(
  5462.     IN PKSPIN Pin,
  5463.     IN const GUID* InterfaceId,
  5464.     OUT PVOID* Interface
  5465.     );
  5466.  
  5467. KSDDKAPI
  5468. PFILE_OBJECT
  5469. NTAPI
  5470. KsPinGetConnectedPinFileObject(
  5471.     IN PKSPIN Pin
  5472.     );
  5473.  
  5474. KSDDKAPI
  5475. PDEVICE_OBJECT
  5476. NTAPI
  5477. KsPinGetConnectedPinDeviceObject(
  5478.     IN PKSPIN Pin
  5479.     );
  5480.  
  5481. KSDDKAPI
  5482. NTSTATUS
  5483. NTAPI
  5484. KsPinGetConnectedFilterInterface(
  5485.     IN PKSPIN Pin,
  5486.     IN const GUID* InterfaceId,
  5487.     OUT PVOID* Interface
  5488.     );
  5489.  
  5490. #if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
  5491.  
  5492. KSDDKAPI
  5493. NTSTATUS
  5494. NTAPI
  5495. KsPinGetReferenceClockInterface(
  5496.     IN PKSPIN Pin,
  5497.     OUT PIKSREFERENCECLOCK* Interface
  5498.     );
  5499.  
  5500. #endif //defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
  5501.  
  5502. KSDDKAPI
  5503. VOID
  5504. NTAPI
  5505. KsPinSetPinClockTime(
  5506.     IN PKSPIN Pin,
  5507.     IN LONGLONG Time
  5508.     );
  5509.  
  5510. KSDDKAPI
  5511. NTSTATUS
  5512. NTAPI
  5513. KsPinSubmitFrame(
  5514.     IN PKSPIN Pin,
  5515.     IN PVOID Data OPTIONAL,
  5516.     IN ULONG Size OPTIONAL,
  5517.     IN PKSSTREAM_HEADER StreamHeader OPTIONAL,
  5518.     IN PVOID Context OPTIONAL
  5519.     );
  5520.  
  5521. KSDDKAPI
  5522. NTSTATUS
  5523. NTAPI
  5524. KsPinSubmitFrameMdl(
  5525.     IN PKSPIN Pin,
  5526.     IN PMDL Mdl OPTIONAL,
  5527.     IN PKSSTREAM_HEADER StreamHeader OPTIONAL,
  5528.     IN PVOID Context OPTIONAL
  5529.     );
  5530.  
  5531. KSDDKAPI
  5532. void
  5533. NTAPI
  5534. KsPinRegisterFrameReturnCallback(
  5535.     IN PKSPIN Pin,
  5536.     IN PFNKSPINFRAMERETURN FrameReturn
  5537.     );
  5538.  
  5539. KSDDKAPI
  5540. void
  5541. NTAPI
  5542. KsPinRegisterIrpCompletionCallback(
  5543.     IN PKSPIN Pin,
  5544.     IN PFNKSPINIRPCOMPLETION IrpCompletion
  5545.     );
  5546.  
  5547. KSDDKAPI
  5548. void
  5549. NTAPI
  5550. KsPinRegisterHandshakeCallback(
  5551.     IN PKSPIN Pin,
  5552.     IN PFNKSPINHANDSHAKE Handshake
  5553.     );
  5554.  
  5555. KSDDKAPI
  5556. void
  5557. NTAPI
  5558. KsFilterRegisterPowerCallbacks(
  5559.     IN PKSFILTER Filter,
  5560.     IN PFNKSFILTERPOWER Sleep OPTIONAL,
  5561.     IN PFNKSFILTERPOWER Wake OPTIONAL
  5562.     );
  5563.  
  5564. KSDDKAPI
  5565. void
  5566. NTAPI
  5567. KsPinRegisterPowerCallbacks(
  5568.     IN PKSPIN Pin,
  5569.     IN PFNKSPINPOWER Sleep OPTIONAL,
  5570.     IN PFNKSPINPOWER Wake OPTIONAL
  5571.     );
  5572.  
  5573. #if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
  5574.  
  5575. KSDDKAPI
  5576. PUNKNOWN
  5577. NTAPI
  5578. KsRegisterAggregatedClientUnknown(
  5579.     IN PVOID Object,
  5580.     IN PUNKNOWN ClientUnknown 
  5581.     );
  5582.  
  5583. KSDDKAPI
  5584. PUNKNOWN
  5585. NTAPI
  5586. KsGetOuterUnknown(
  5587.     IN PVOID Object
  5588.     );
  5589.  
  5590. PUNKNOWN __inline
  5591. KsDeviceRegisterAggregatedClientUnknown(
  5592.     IN PKSDEVICE Device,
  5593.     IN PUNKNOWN ClientUnknown 
  5594.     )
  5595. {
  5596.     return KsRegisterAggregatedClientUnknown((PVOID) Device,ClientUnknown);
  5597. }
  5598.  
  5599. PUNKNOWN __inline
  5600. KsDeviceGetOuterUnknown(
  5601.     IN PKSDEVICE Device
  5602.     )
  5603. {
  5604.     return KsGetOuterUnknown((PVOID) Device);
  5605. }
  5606.  
  5607. PUNKNOWN __inline
  5608. KsFilterFactoryRegisterAggregatedClientUnknown(
  5609.     IN PKSFILTERFACTORY FilterFactory,
  5610.     IN PUNKNOWN ClientUnknown 
  5611.     )
  5612. {
  5613.     return KsRegisterAggregatedClientUnknown((PVOID) FilterFactory,ClientUnknown);
  5614. }
  5615.  
  5616. PUNKNOWN __inline
  5617. KsFilterFactoryGetOuterUnknown(
  5618.     IN PKSFILTERFACTORY FilterFactory
  5619.     )
  5620. {
  5621.     return KsGetOuterUnknown((PVOID) FilterFactory);
  5622. }
  5623.  
  5624. PUNKNOWN __inline
  5625. KsFilterRegisterAggregatedClientUnknown(
  5626.     IN PKSFILTER Filter,
  5627.     IN PUNKNOWN ClientUnknown 
  5628.     )
  5629. {
  5630.     return KsRegisterAggregatedClientUnknown((PVOID) Filter,ClientUnknown);
  5631. }
  5632.  
  5633. PUNKNOWN __inline
  5634. KsFilterGetOuterUnknown(
  5635.     IN PKSFILTER Filter
  5636.     )
  5637. {
  5638.     return KsGetOuterUnknown((PVOID) Filter);
  5639. }
  5640.  
  5641. PUNKNOWN __inline
  5642. KsPinRegisterAggregatedClientUnknown(
  5643.     IN PKSPIN Pin,
  5644.     IN PUNKNOWN ClientUnknown 
  5645.     )
  5646. {
  5647.     return KsRegisterAggregatedClientUnknown((PVOID) Pin,ClientUnknown);
  5648. }
  5649.  
  5650. PUNKNOWN __inline
  5651. KsPinGetOuterUnknown(
  5652.     IN PKSPIN Pin
  5653.     )
  5654. {
  5655.     return KsGetOuterUnknown((PVOID) Pin);
  5656. }
  5657.  
  5658. #endif // defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
  5659.  
  5660. #else // !defined(_NTDDK_)
  5661.  
  5662. #if !defined( KS_NO_CREATE_FUNCTIONS )
  5663.  
  5664. KSDDKAPI
  5665. DWORD
  5666. WINAPI
  5667. KsCreateAllocator(
  5668.     IN HANDLE ConnectionHandle,
  5669.     IN PKSALLOCATOR_FRAMING AllocatorFraming,
  5670.     OUT PHANDLE AllocatorHandle
  5671.     );
  5672.  
  5673. KSDDKAPI
  5674. DWORD
  5675. NTAPI
  5676. KsCreateClock(
  5677.     IN HANDLE ConnectionHandle,
  5678.     IN PKSCLOCK_CREATE ClockCreate,
  5679.     OUT PHANDLE ClockHandle
  5680.     );
  5681.  
  5682. KSDDKAPI
  5683. DWORD
  5684. WINAPI
  5685. KsCreatePin(
  5686.     IN HANDLE FilterHandle,
  5687.     IN PKSPIN_CONNECT Connect,
  5688.     IN ACCESS_MASK DesiredAccess,
  5689.     OUT PHANDLE ConnectionHandle
  5690.     );
  5691.  
  5692. KSDDKAPI
  5693. DWORD
  5694. WINAPI
  5695. KsCreateTopologyNode(
  5696.     IN HANDLE ParentHandle,
  5697.     IN PKSNODE_CREATE NodeCreate,
  5698.     IN ACCESS_MASK DesiredAccess,
  5699.     OUT PHANDLE NodeHandle
  5700.     );
  5701.     
  5702. #endif
  5703.  
  5704. #endif // !defined(_NTDDK_)
  5705.  
  5706. #if defined(__cplusplus)
  5707. }
  5708. #endif // defined(__cplusplus)
  5709.  
  5710.  
  5711.  
  5712. /////////////////////////////////////////////////////////////////////////////
  5713. //
  5714. //  Windows XP vs. DirectX 8.0 header merge
  5715. //
  5716. //  The following is the original contents of this header from
  5717. //  the DirectX 8.0 SDK.
  5718. //
  5719. /////////////////////////////////////////////////////////////////////////////
  5720.  
  5721. #else     // DirectX 8.0 content
  5722.  
  5723.     #if !defined(_NTRTL_)
  5724.         #ifndef DEFINE_GUIDEX
  5725.             #define DEFINE_GUIDEX(name) EXTERN_C const CDECL GUID name
  5726.         #endif // !defined(DEFINE_GUIDEX)
  5727.  
  5728.         #ifndef STATICGUIDOF
  5729.             #define STATICGUIDOF(guid) STATIC_##guid
  5730.         #endif // !defined(STATICGUIDOF)
  5731.     #endif // !defined(_NTRTL_)
  5732.  
  5733.     #ifndef SIZEOF_ARRAY
  5734.         #define SIZEOF_ARRAY(ar)        (sizeof(ar)/sizeof((ar)[0]))
  5735.     #endif // !defined(SIZEOF_ARRAY)
  5736.  
  5737.     #if defined(__cplusplus) && _MSC_VER >= 1100
  5738.     #define DEFINE_GUIDSTRUCT(g, n) struct __declspec(uuid(g)) n
  5739.     #define DEFINE_GUIDNAMED(n) __uuidof(struct n)
  5740.     #else // !defined(__cplusplus)
  5741.     #define DEFINE_GUIDSTRUCT(g, n) DEFINE_GUIDEX(n)
  5742.     #define DEFINE_GUIDNAMED(n) n
  5743.     #endif // !defined(__cplusplus)
  5744.  
  5745.     //===========================================================================
  5746.  
  5747.     #define STATIC_GUID_NULL \
  5748.         0x00000000L, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  5749.  
  5750.     DEFINE_GUIDSTRUCT("00000000-0000-0000-0000-000000000000", GUID_NULL);
  5751.     #define GUID_NULL DEFINE_GUIDNAMED(GUID_NULL)
  5752.  
  5753.     //===========================================================================
  5754.  
  5755.     #define IOCTL_KS_PROPERTY              CTL_CODE(FILE_DEVICE_KS, 0x000, METHOD_NEITHER, FILE_ANY_ACCESS)
  5756.     #define IOCTL_KS_ENABLE_EVENT          CTL_CODE(FILE_DEVICE_KS, 0x001, METHOD_NEITHER, FILE_ANY_ACCESS)
  5757.     #define IOCTL_KS_DISABLE_EVENT         CTL_CODE(FILE_DEVICE_KS, 0x002, METHOD_NEITHER, FILE_ANY_ACCESS)
  5758.     #define IOCTL_KS_METHOD                CTL_CODE(FILE_DEVICE_KS, 0x003, METHOD_NEITHER, FILE_ANY_ACCESS)
  5759.     #define IOCTL_KS_WRITE_STREAM          CTL_CODE(FILE_DEVICE_KS, 0x004, METHOD_NEITHER, FILE_WRITE_ACCESS)
  5760.     #define IOCTL_KS_READ_STREAM           CTL_CODE(FILE_DEVICE_KS, 0x005, METHOD_NEITHER, FILE_READ_ACCESS)
  5761.     #define IOCTL_KS_RESET_STATE           CTL_CODE(FILE_DEVICE_KS, 0x006, METHOD_NEITHER, FILE_ANY_ACCESS)
  5762.  
  5763.     //===========================================================================
  5764.  
  5765.     typedef enum {
  5766.         KSRESET_BEGIN,
  5767.         KSRESET_END
  5768.     } KSRESET;
  5769.  
  5770.     typedef enum {
  5771.         KSSTATE_STOP,
  5772.         KSSTATE_ACQUIRE,
  5773.         KSSTATE_PAUSE,
  5774.         KSSTATE_RUN
  5775.     } KSSTATE, *PKSSTATE;
  5776.  
  5777.     #define KSPRIORITY_LOW        0x00000001
  5778.     #define KSPRIORITY_NORMAL     0x40000000
  5779.     #define KSPRIORITY_HIGH       0x80000000
  5780.     #define KSPRIORITY_EXCLUSIVE  0xFFFFFFFF
  5781.  
  5782.     typedef struct {
  5783.         ULONG   PriorityClass;
  5784.         ULONG   PrioritySubClass;
  5785.     } KSPRIORITY, *PKSPRIORITY;
  5786.  
  5787.     typedef struct {
  5788.         union {
  5789.     #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ )
  5790.             struct _IDENTIFIER {
  5791.     #else        
  5792.             struct {
  5793.     #endif        
  5794.                 GUID    Set;
  5795.                 ULONG   Id;
  5796.                 ULONG   Flags;
  5797.             };
  5798.             LONGLONG    Alignment;
  5799.         };
  5800.     } KSIDENTIFIER, *PKSIDENTIFIER;
  5801.  
  5802.     typedef KSIDENTIFIER KSPROPERTY, *PKSPROPERTY, KSMETHOD, *PKSMETHOD, KSEVENT, *PKSEVENT;
  5803.  
  5804.     #define KSMETHOD_TYPE_NONE                  0x00000000
  5805.     #define KSMETHOD_TYPE_READ                  0x00000001
  5806.     #define KSMETHOD_TYPE_WRITE                 0x00000002
  5807.     #define KSMETHOD_TYPE_MODIFY                0x00000003
  5808.     #define KSMETHOD_TYPE_SOURCE                0x00000004
  5809.  
  5810.     #define KSMETHOD_TYPE_SEND                  0x00000001
  5811.     #define KSMETHOD_TYPE_SETSUPPORT            0x00000100
  5812.     #define KSMETHOD_TYPE_BASICSUPPORT          0x00000200
  5813.  
  5814.     #define KSMETHOD_TYPE_TOPOLOGY 0x10000000
  5815.  
  5816.     #define KSPROPERTY_TYPE_GET                 0x00000001
  5817.     #define KSPROPERTY_TYPE_SET                 0x00000002
  5818.     #define KSPROPERTY_TYPE_SETSUPPORT          0x00000100
  5819.     #define KSPROPERTY_TYPE_BASICSUPPORT        0x00000200
  5820.     #define KSPROPERTY_TYPE_RELATIONS           0x00000400
  5821.     #define KSPROPERTY_TYPE_SERIALIZESET        0x00000800
  5822.     #define KSPROPERTY_TYPE_UNSERIALIZESET      0x00001000
  5823.     #define KSPROPERTY_TYPE_SERIALIZERAW        0x00002000
  5824.     #define KSPROPERTY_TYPE_UNSERIALIZERAW      0x00004000
  5825.     #define KSPROPERTY_TYPE_SERIALIZESIZE       0x00008000
  5826.     #define KSPROPERTY_TYPE_DEFAULTVALUES       0x00010000
  5827.  
  5828.     #define KSPROPERTY_TYPE_TOPOLOGY 0x10000000
  5829.  
  5830.     typedef struct {
  5831.         KSPROPERTY      Property;
  5832.         ULONG           NodeId;
  5833.         ULONG           Reserved;
  5834.     } KSP_NODE, *PKSP_NODE;
  5835.  
  5836.     typedef struct {
  5837.         KSMETHOD        Method;
  5838.         ULONG           NodeId;
  5839.         ULONG           Reserved;
  5840.     } KSM_NODE, *PKSM_NODE;
  5841.  
  5842.     typedef struct {
  5843.         KSEVENT         Event;
  5844.         ULONG           NodeId;
  5845.         ULONG           Reserved;
  5846.     } KSE_NODE, *PKSE_NODE;
  5847.  
  5848.     #define STATIC_KSPROPTYPESETID_General \
  5849.         0x97E99BA0L, 0xBDEA, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  5850.     DEFINE_GUIDSTRUCT("97E99BA0-BDEA-11CF-A5D6-28DB04C10000", KSPROPTYPESETID_General);
  5851.     #define KSPROPTYPESETID_General DEFINE_GUIDNAMED(KSPROPTYPESETID_General)
  5852.  
  5853.     #if defined(_NTDDK_) && !defined(__wtypes_h__)
  5854.     enum VARENUM {
  5855.         VT_EMPTY = 0,
  5856.         VT_NULL = 1,
  5857.         VT_I2 = 2,
  5858.         VT_I4 = 3,
  5859.         VT_R4 = 4,
  5860.         VT_R8 = 5,
  5861.         VT_CY = 6,
  5862.         VT_DATE = 7,
  5863.         VT_BSTR = 8,
  5864.         VT_DISPATCH = 9,
  5865.         VT_ERROR = 10,
  5866.         VT_BOOL = 11,
  5867.         VT_VARIANT = 12,
  5868.         VT_UNKNOWN = 13,
  5869.         VT_DECIMAL = 14,
  5870.         VT_I1 = 16,
  5871.         VT_UI1 = 17,
  5872.         VT_UI2 = 18,
  5873.         VT_UI4 = 19,
  5874.         VT_I8 = 20,
  5875.         VT_UI8 = 21,
  5876.         VT_INT = 22,
  5877.         VT_UINT = 23,
  5878.         VT_VOID = 24,
  5879.         VT_HRESULT  = 25,
  5880.         VT_PTR = 26,
  5881.         VT_SAFEARRAY = 27,
  5882.         VT_CARRAY = 28,
  5883.         VT_USERDEFINED = 29,
  5884.         VT_LPSTR = 30,
  5885.         VT_LPWSTR = 31,
  5886.         VT_FILETIME = 64,
  5887.         VT_BLOB = 65,
  5888.         VT_STREAM = 66,
  5889.         VT_STORAGE = 67,
  5890.         VT_STREAMED_OBJECT = 68,
  5891.         VT_STORED_OBJECT = 69,
  5892.         VT_BLOB_OBJECT = 70,
  5893.         VT_CF = 71,
  5894.         VT_CLSID = 72,
  5895.         VT_VECTOR = 0x1000,
  5896.         VT_ARRAY = 0x2000,
  5897.         VT_BYREF = 0x4000,
  5898.         VT_RESERVED = 0x8000,
  5899.         VT_ILLEGAL = 0xffff,
  5900.         VT_ILLEGALMASKED = 0xfff,
  5901.         VT_TYPEMASK = 0xfff
  5902.     };
  5903.     #endif // _NTDDK_ && !__wtypes_h__
  5904.  
  5905.     typedef struct {
  5906.         ULONG    Size;
  5907.         ULONG    Count;
  5908.     } KSMULTIPLE_ITEM, *PKSMULTIPLE_ITEM;
  5909.  
  5910.     typedef struct {
  5911.         ULONG           AccessFlags;
  5912.         ULONG           DescriptionSize;
  5913.         KSIDENTIFIER    PropTypeSet;
  5914.         ULONG           MembersListCount;
  5915.         ULONG           Reserved;
  5916.     } KSPROPERTY_DESCRIPTION, *PKSPROPERTY_DESCRIPTION;
  5917.  
  5918.     #define KSPROPERTY_MEMBER_RANGES            0x00000001
  5919.     #define KSPROPERTY_MEMBER_STEPPEDRANGES     0x00000002
  5920.     #define KSPROPERTY_MEMBER_VALUES            0x00000003
  5921.  
  5922.     #define KSPROPERTY_MEMBER_FLAG_DEFAULT      0x00000001
  5923.  
  5924.     typedef struct {
  5925.         ULONG   MembersFlags;
  5926.         ULONG   MembersSize;
  5927.         ULONG   MembersCount;
  5928.         ULONG   Flags;
  5929.     } KSPROPERTY_MEMBERSHEADER, *PKSPROPERTY_MEMBERSHEADER;
  5930.  
  5931.     typedef union {
  5932.     #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ )
  5933.         struct _SIGNED {
  5934.     #else
  5935.         struct {
  5936.     #endif    
  5937.             LONG    SignedMinimum;
  5938.             LONG    SignedMaximum;
  5939.         };
  5940.     #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ )
  5941.         struct _UNSIGNED {
  5942.     #else
  5943.         struct {
  5944.     #endif    
  5945.             ULONG   UnsignedMinimum;
  5946.             ULONG   UnsignedMaximum;
  5947.         };
  5948.     } KSPROPERTY_BOUNDS_LONG, *PKSPROPERTY_BOUNDS_LONG;
  5949.  
  5950.     typedef union {
  5951.     #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ )
  5952.         struct _SIGNED64 {
  5953.     #else
  5954.         struct {
  5955.     #endif    
  5956.             LONGLONG    SignedMinimum;
  5957.             LONGLONG    SignedMaximum;
  5958.         };
  5959.     #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ )
  5960.         struct _UNSIGNED64 {
  5961.     #else
  5962.         struct {
  5963.     #endif    
  5964.     #if defined(_NTDDK_)
  5965.             ULONGLONG   UnsignedMinimum;
  5966.             ULONGLONG   UnsignedMaximum;
  5967.     #else // !_NTDDK_
  5968.             DWORDLONG   UnsignedMinimum;
  5969.             DWORDLONG   UnsignedMaximum;
  5970.     #endif // !_NTDDK_
  5971.         };
  5972.     } KSPROPERTY_BOUNDS_LONGLONG, *PKSPROPERTY_BOUNDS_LONGLONG;
  5973.  
  5974.     typedef struct {
  5975.         ULONG                       SteppingDelta;
  5976.         ULONG                       Reserved;
  5977.         KSPROPERTY_BOUNDS_LONG      Bounds;
  5978.     } KSPROPERTY_STEPPING_LONG, *PKSPROPERTY_STEPPING_LONG;
  5979.  
  5980.     typedef struct {
  5981.     #if defined(_NTDDK_)
  5982.         ULONGLONG                   SteppingDelta;
  5983.     #else // !_NTDDK_
  5984.         DWORDLONG                   SteppingDelta;
  5985.     #endif // !_NTDDK_
  5986.         KSPROPERTY_BOUNDS_LONGLONG  Bounds;
  5987.     } KSPROPERTY_STEPPING_LONGLONG, *PKSPROPERTY_STEPPING_LONGLONG;
  5988.  
  5989.     //===========================================================================
  5990.  
  5991.     #if defined(_NTDDK_)
  5992.     //
  5993.     // Structure forward declarations.
  5994.     //
  5995.     typedef struct _KSDEVICE_DESCRIPTOR
  5996.     KSDEVICE_DESCRIPTOR, *PKSDEVICE_DESCRIPTOR;
  5997.     typedef struct _KSDEVICE_DISPATCH
  5998.     KSDEVICE_DISPATCH, *PKSDEVICE_DISPATCH;
  5999.     typedef struct _KSDEVICE 
  6000.     KSDEVICE, *PKSDEVICE;
  6001.     typedef struct _KSFILTERFACTORY 
  6002.     KSFILTERFACTORY, *PKSFILTERFACTORY;
  6003.     typedef struct _KSFILTER_DESCRIPTOR
  6004.     KSFILTER_DESCRIPTOR, *PKSFILTER_DESCRIPTOR;
  6005.     typedef struct _KSFILTER_DISPATCH
  6006.     KSFILTER_DISPATCH, *PKSFILTER_DISPATCH;
  6007.     typedef struct _KSFILTER 
  6008.     KSFILTER, *PKSFILTER;
  6009.     typedef struct _KSPIN_DESCRIPTOR_EX
  6010.     KSPIN_DESCRIPTOR_EX, *PKSPIN_DESCRIPTOR_EX;
  6011.     typedef struct _KSPIN_DISPATCH
  6012.     KSPIN_DISPATCH, *PKSPIN_DISPATCH;
  6013.     typedef struct _KSCLOCK_DISPATCH
  6014.     KSCLOCK_DISPATCH, *PKSCLOCK_DISPATCH;
  6015.     typedef struct _KSALLOCATOR_DISPATCH
  6016.     KSALLOCATOR_DISPATCH, *PKSALLOCATOR_DISPATCH;
  6017.     typedef struct _KSPIN 
  6018.     KSPIN, *PKSPIN;
  6019.     typedef struct _KSNODE_DESCRIPTOR
  6020.     KSNODE_DESCRIPTOR, *PKSNODE_DESCRIPTOR;
  6021.     typedef struct _KSSTREAM_POINTER_OFFSET
  6022.     KSSTREAM_POINTER_OFFSET, *PKSSTREAM_POINTER_OFFSET;
  6023.     typedef struct _KSSTREAM_POINTER
  6024.     KSSTREAM_POINTER, *PKSSTREAM_POINTER;
  6025.     typedef struct _KSMAPPING
  6026.     KSMAPPING, *PKSMAPPING;
  6027.     typedef struct _KSPROCESSPIN
  6028.     KSPROCESSPIN, *PKSPROCESSPIN;
  6029.     typedef struct _KSPROCESSPIN_INDEXENTRY
  6030.     KSPROCESSPIN_INDEXENTRY, *PKSPROCESSPIN_INDEXENTRY;
  6031.     #endif // _NTDDK_
  6032.  
  6033.     typedef PVOID PKSWORKER;
  6034.  
  6035.     typedef struct {
  6036.         ULONG       NotificationType;
  6037.         union {
  6038.             struct {
  6039.                 HANDLE              Event;
  6040.                 ULONG_PTR           Reserved[2];
  6041.             } EventHandle;
  6042.             struct {
  6043.                 HANDLE              Semaphore;
  6044.                 ULONG               Reserved;
  6045.                 LONG                Adjustment;
  6046.             } SemaphoreHandle;
  6047.     #if defined(_NTDDK_)
  6048.             struct {
  6049.                 PVOID               Event;
  6050.                 KPRIORITY           Increment;
  6051.                 ULONG_PTR           Reserved;
  6052.             } EventObject;
  6053.             struct {
  6054.                 PVOID               Semaphore;
  6055.                 KPRIORITY           Increment;
  6056.                 LONG                Adjustment;
  6057.             } SemaphoreObject;
  6058.             struct {
  6059.                 PKDPC               Dpc;
  6060.                 ULONG               ReferenceCount;
  6061.                 ULONG_PTR           Reserved;
  6062.             } Dpc;
  6063.             struct {
  6064.                 PWORK_QUEUE_ITEM    WorkQueueItem;
  6065.                 WORK_QUEUE_TYPE     WorkQueueType;
  6066.                 ULONG_PTR           Reserved;
  6067.             } WorkItem;
  6068.             struct {
  6069.                 PWORK_QUEUE_ITEM    WorkQueueItem;
  6070.                 PKSWORKER           KsWorkerObject;
  6071.                 ULONG_PTR           Reserved;
  6072.             } KsWorkItem;
  6073.     // @@BEGIN_DDKSPLIT
  6074.             struct {
  6075.                 PKSFILTER           Filter;
  6076.                 ULONG_PTR           Reserved[2];
  6077.             } KsFilterProcessing;
  6078.             struct {
  6079.                 PKSPIN              Pin;
  6080.                 ULONG_PTR           Reserved[2];
  6081.             } KsPinProcessing;
  6082.     // @@END_DDKSPLIT
  6083.     #endif // defined(_NTDDK_)
  6084.             struct {
  6085.                 PVOID               Unused;
  6086.                 LONG_PTR            Alignment[2];
  6087.             } Alignment;
  6088.         };
  6089.     } KSEVENTDATA, *PKSEVENTDATA;
  6090.  
  6091.     #define KSEVENTF_EVENT_HANDLE       0x00000001
  6092.     #define KSEVENTF_SEMAPHORE_HANDLE   0x00000002
  6093.     #if defined(_NTDDK_)
  6094.     #define KSEVENTF_EVENT_OBJECT       0x00000004
  6095.     #define KSEVENTF_SEMAPHORE_OBJECT   0x00000008
  6096.     #define KSEVENTF_DPC                0x00000010
  6097.     #define KSEVENTF_WORKITEM           0x00000020
  6098.     #define KSEVENTF_KSWORKITEM         0x00000080
  6099.     // @@BEGIN_DDKSPLIT
  6100.     #define KSEVENTF_KSFILTERPROCESSING 0x00000100
  6101.     #define KSEVENTF_KSPINPROCESSING    0x00000200
  6102.     // @@END_DDKSPLIT
  6103.     #endif // defined(_NTDDK_)
  6104.  
  6105.     #define KSEVENT_TYPE_ENABLE         0x00000001
  6106.     #define KSEVENT_TYPE_ONESHOT        0x00000002
  6107.     #define KSEVENT_TYPE_ENABLEBUFFERED 0x00000004
  6108.     #define KSEVENT_TYPE_SETSUPPORT     0x00000100
  6109.     #define KSEVENT_TYPE_BASICSUPPORT   0x00000200
  6110.     #define KSEVENT_TYPE_QUERYBUFFER    0x00000400
  6111.  
  6112.     #define KSEVENT_TYPE_TOPOLOGY 0x10000000
  6113.  
  6114.     typedef struct {
  6115.         KSEVENT         Event;
  6116.         PKSEVENTDATA    EventData;
  6117.         PVOID           Reserved;
  6118.     } KSQUERYBUFFER, *PKSQUERYBUFFER;
  6119.  
  6120.     typedef struct {
  6121.         ULONG Size;
  6122.         ULONG Flags;
  6123.         union {
  6124.             HANDLE ObjectHandle;
  6125.             PVOID ObjectPointer;
  6126.         };
  6127.         PVOID Reserved;
  6128.         KSEVENT Event;
  6129.         KSEVENTDATA EventData;
  6130.     } KSRELATIVEEVENT;
  6131.  
  6132.     #define KSRELATIVEEVENT_FLAG_HANDLE 0x00000001
  6133.     #define KSRELATIVEEVENT_FLAG_POINTER 0x00000002
  6134.  
  6135.     //===========================================================================
  6136.  
  6137.     typedef struct {
  6138.         KSEVENTDATA     EventData;
  6139.         LONGLONG        MarkTime;
  6140.     } KSEVENT_TIME_MARK, *PKSEVENT_TIME_MARK;
  6141.  
  6142.     typedef struct {
  6143.         KSEVENTDATA     EventData;
  6144.         LONGLONG        TimeBase;
  6145.         LONGLONG        Interval;
  6146.     } KSEVENT_TIME_INTERVAL, *PKSEVENT_TIME_INTERVAL;
  6147.  
  6148.     typedef struct {
  6149.         LONGLONG        TimeBase;
  6150.         LONGLONG        Interval;
  6151.     } KSINTERVAL, *PKSINTERVAL;
  6152.  
  6153.     //===========================================================================
  6154.  
  6155.     #define STATIC_KSPROPSETID_General\
  6156.         0x1464EDA5L, 0x6A8F, 0x11D1, 0x9A, 0xA7, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  6157.     DEFINE_GUIDSTRUCT("1464EDA5-6A8F-11D1-9AA7-00A0C9223196", KSPROPSETID_General);
  6158.     #define KSPROPSETID_General DEFINE_GUIDNAMED(KSPROPSETID_General)
  6159.  
  6160.     typedef enum {
  6161.         KSPROPERTY_GENERAL_COMPONENTID
  6162.     } KSPROPERTY_GENERAL;
  6163.  
  6164.     typedef struct {
  6165.         GUID    Manufacturer;
  6166.         GUID    Product;
  6167.         GUID    Component;
  6168.         GUID    Name;
  6169.         ULONG   Version;
  6170.         ULONG   Revision;
  6171.     } KSCOMPONENTID, *PKSCOMPONENTID;
  6172.  
  6173.     #define DEFINE_KSPROPERTY_ITEM_GENERAL_COMPONENTID(Handler)\
  6174.         DEFINE_KSPROPERTY_ITEM(\
  6175.             KSPROPERTY_GENERAL_COMPONENTID,\
  6176.             (Handler),\
  6177.             sizeof(KSPROPERTY),\
  6178.             sizeof(KSCOMPONENTID),\
  6179.             NULL, NULL, 0, NULL, NULL, 0)
  6180.  
  6181.     #define STATIC_KSMETHODSETID_StreamIo\
  6182.         0x65D003CAL, 0x1523, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  6183.     DEFINE_GUIDSTRUCT("65D003CA-1523-11D2-B27A-00A0C9223196", KSMETHODSETID_StreamIo);
  6184.     #define KSMETHODSETID_StreamIo DEFINE_GUIDNAMED(KSMETHODSETID_StreamIo)
  6185.  
  6186.     typedef enum {
  6187.         KSMETHOD_STREAMIO_READ,
  6188.         KSMETHOD_STREAMIO_WRITE
  6189.     } KSMETHOD_STREAMIO;
  6190.  
  6191.     #define DEFINE_KSMETHOD_ITEM_STREAMIO_READ(Handler)\
  6192.         DEFINE_KSMETHOD_ITEM(\
  6193.             KSMETHOD_STREAMIO_READ,\
  6194.             KSMETHOD_TYPE_WRITE,\
  6195.             (Handler),\
  6196.             sizeof(KSMETHOD),\
  6197.             0,\
  6198.             NULL)
  6199.  
  6200.     #define DEFINE_KSMETHOD_ITEM_STREAMIO_WRITE(Handler)\
  6201.         DEFINE_KSMETHOD_ITEM(\
  6202.             KSMETHOD_STREAMIO_WRITE,\
  6203.             KSMETHOD_TYPE_READ,\
  6204.             (Handler),\
  6205.             sizeof(KSMETHOD),\
  6206.             0,\
  6207.             NULL)
  6208.  
  6209.     #define STATIC_KSPROPSETID_MediaSeeking\
  6210.         0xEE904F0CL, 0xD09B, 0x11D0, 0xAB, 0xE9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  6211.     DEFINE_GUIDSTRUCT("EE904F0C-D09B-11D0-ABE9-00A0C9223196", KSPROPSETID_MediaSeeking);
  6212.     #define KSPROPSETID_MediaSeeking DEFINE_GUIDNAMED(KSPROPSETID_MediaSeeking)
  6213.  
  6214.     typedef enum {
  6215.         KSPROPERTY_MEDIASEEKING_CAPABILITIES,
  6216.         KSPROPERTY_MEDIASEEKING_FORMATS,
  6217.         KSPROPERTY_MEDIASEEKING_TIMEFORMAT,
  6218.         KSPROPERTY_MEDIASEEKING_POSITION,
  6219.         KSPROPERTY_MEDIASEEKING_STOPPOSITION,
  6220.         KSPROPERTY_MEDIASEEKING_POSITIONS,
  6221.         KSPROPERTY_MEDIASEEKING_DURATION,
  6222.         KSPROPERTY_MEDIASEEKING_AVAILABLE,
  6223.         KSPROPERTY_MEDIASEEKING_PREROLL,
  6224.         KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT
  6225.     } KSPROPERTY_MEDIASEEKING;
  6226.  
  6227.     typedef enum {
  6228.         KS_SEEKING_NoPositioning,
  6229.         KS_SEEKING_AbsolutePositioning,
  6230.         KS_SEEKING_RelativePositioning,
  6231.         KS_SEEKING_IncrementalPositioning,
  6232.         KS_SEEKING_PositioningBitsMask = 0x3,
  6233.         KS_SEEKING_SeekToKeyFrame,
  6234.         KS_SEEKING_ReturnTime = 0x8
  6235.     } KS_SEEKING_FLAGS;
  6236.  
  6237.     typedef enum {
  6238.         KS_SEEKING_CanSeekAbsolute = 0x1,
  6239.         KS_SEEKING_CanSeekForwards = 0x2,
  6240.         KS_SEEKING_CanSeekBackwards = 0x4,
  6241.         KS_SEEKING_CanGetCurrentPos = 0x8,
  6242.         KS_SEEKING_CanGetStopPos = 0x10,
  6243.         KS_SEEKING_CanGetDuration = 0x20,
  6244.         KS_SEEKING_CanPlayBackwards = 0x40
  6245.     } KS_SEEKING_CAPABILITIES;
  6246.  
  6247.     typedef struct {
  6248.         LONGLONG            Current;
  6249.         LONGLONG            Stop;
  6250.         KS_SEEKING_FLAGS    CurrentFlags;
  6251.         KS_SEEKING_FLAGS    StopFlags;
  6252.     } KSPROPERTY_POSITIONS, *PKSPROPERTY_POSITIONS;
  6253.  
  6254.     typedef struct {
  6255.         LONGLONG    Earliest;
  6256.         LONGLONG    Latest;
  6257.     } KSPROPERTY_MEDIAAVAILABLE, *PKSPROPERTY_MEDIAAVAILABLE;
  6258.  
  6259.     typedef struct {
  6260.         KSPROPERTY  Property;
  6261.         GUID        SourceFormat;
  6262.         GUID        TargetFormat;
  6263.         LONGLONG    Time;
  6264.     } KSP_TIMEFORMAT, *PKSP_TIMEFORMAT;
  6265.  
  6266.     #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_CAPABILITIES(Handler)\
  6267.         DEFINE_KSPROPERTY_ITEM(\
  6268.             KSPROPERTY_MEDIASEEKING_CAPABILITIES,\
  6269.             (Handler),\
  6270.             sizeof(KSPROPERTY),\
  6271.             sizeof(KS_SEEKING_CAPABILITIES),\
  6272.             NULL, NULL, 0, NULL, NULL, 0)
  6273.  
  6274.     #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_FORMATS(Handler)\
  6275.         DEFINE_KSPROPERTY_ITEM(\
  6276.             KSPROPERTY_MEDIASEEKING_FORMATS,\
  6277.             (Handler),\
  6278.             sizeof(KSPROPERTY),\
  6279.             0,\
  6280.             NULL, NULL, 0, NULL, NULL, 0)
  6281.  
  6282.     #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_TIMEFORMAT(GetHandler, SetHandler)\
  6283.         DEFINE_KSPROPERTY_ITEM(\
  6284.             KSPROPERTY_MEDIASEEKING_TIMEFORMAT,\
  6285.             (GetHandler),\
  6286.             sizeof(KSPROPERTY),\
  6287.             sizeof(GUID),\
  6288.             (SetHandler),\
  6289.             NULL, 0, NULL, NULL, 0)
  6290.  
  6291.     #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_POSITION(Handler)\
  6292.         DEFINE_KSPROPERTY_ITEM(\
  6293.             KSPROPERTY_MEDIASEEKING_POSITION,\
  6294.             (Handler),\
  6295.             sizeof(KSPROPERTY),\
  6296.             sizeof(LONGLONG),\
  6297.             NULL, NULL, 0, NULL, NULL, 0)
  6298.  
  6299.     #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_STOPPOSITION(Handler)\
  6300.         DEFINE_KSPROPERTY_ITEM(\
  6301.             KSPROPERTY_MEDIASEEKING_STOPPOSITION,\
  6302.             (Handler),\
  6303.             sizeof(KSPROPERTY),\
  6304.             sizeof(LONGLONG),\
  6305.             NULL, NULL, 0, NULL, NULL, 0)
  6306.  
  6307.     #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_POSITIONS(Handler)\
  6308.         DEFINE_KSPROPERTY_ITEM(\
  6309.             KSPROPERTY_MEDIASEEKING_POSITIONS,\
  6310.             NULL,\
  6311.             sizeof(KSPROPERTY),\
  6312.             sizeof(KSPROPERTY_POSITIONS),\
  6313.             (Handler),\
  6314.             NULL, 0, NULL, NULL, 0)
  6315.  
  6316.     #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_DURATION(Handler)\
  6317.         DEFINE_KSPROPERTY_ITEM(\
  6318.             KSPROPERTY_MEDIASEEKING_DURATION,\
  6319.             (Handler),\
  6320.             sizeof(KSPROPERTY),\
  6321.             sizeof(LONGLONG),\
  6322.             NULL, NULL, 0, NULL, NULL, 0)
  6323.  
  6324.     #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_AVAILABLE(Handler)\
  6325.         DEFINE_KSPROPERTY_ITEM(\
  6326.             KSPROPERTY_MEDIASEEKING_AVAILABLE,\
  6327.             (Handler),\
  6328.             sizeof(KSPROPERTY),\
  6329.             sizeof(KSPROPERTY_MEDIAAVAILABLE),\
  6330.             NULL, NULL, 0, NULL, NULL, 0)
  6331.  
  6332.     #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_PREROLL(Handler)\
  6333.         DEFINE_KSPROPERTY_ITEM(\
  6334.             KSPROPERTY_MEDIASEEKING_PREROLL,\
  6335.             (Handler),\
  6336.             sizeof(KSPROPERTY),\
  6337.             sizeof(LONGLONG),\
  6338.             NULL, NULL, 0, NULL, NULL, 0)
  6339.  
  6340.     #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_CONVERTTIMEFORMAT(Handler)\
  6341.         DEFINE_KSPROPERTY_ITEM(\
  6342.             KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT,\
  6343.             (Handler),\
  6344.             sizeof(KSP_TIMEFORMAT),\
  6345.             sizeof(LONGLONG),\
  6346.             NULL, NULL, 0, NULL, NULL, 0)
  6347.  
  6348.     //===========================================================================
  6349.  
  6350.     #define STATIC_KSPROPSETID_Topology\
  6351.         0x720D4AC0L, 0x7533, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  6352.     DEFINE_GUIDSTRUCT("720D4AC0-7533-11D0-A5D6-28DB04C10000", KSPROPSETID_Topology);
  6353.     #define KSPROPSETID_Topology DEFINE_GUIDNAMED(KSPROPSETID_Topology)
  6354.  
  6355.     typedef enum {
  6356.         KSPROPERTY_TOPOLOGY_CATEGORIES,
  6357.         KSPROPERTY_TOPOLOGY_NODES,
  6358.         KSPROPERTY_TOPOLOGY_CONNECTIONS,
  6359.         KSPROPERTY_TOPOLOGY_NAME
  6360.     } KSPROPERTY_TOPOLOGY;
  6361.  
  6362.     #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CATEGORIES(Handler)\
  6363.         DEFINE_KSPROPERTY_ITEM(\
  6364.             KSPROPERTY_TOPOLOGY_CATEGORIES,\
  6365.             (Handler),\
  6366.             sizeof(KSPROPERTY),\
  6367.             0,\
  6368.             NULL, NULL, 0, NULL, NULL, 0)
  6369.  
  6370.     #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NODES(Handler)\
  6371.         DEFINE_KSPROPERTY_ITEM(\
  6372.             KSPROPERTY_TOPOLOGY_NODES,\
  6373.             (Handler),\
  6374.             sizeof(KSPROPERTY),\
  6375.             0,\
  6376.             NULL, NULL, 0, NULL, NULL, 0)
  6377.  
  6378.     #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CONNECTIONS(Handler)\
  6379.         DEFINE_KSPROPERTY_ITEM(\
  6380.             KSPROPERTY_TOPOLOGY_CONNECTIONS,\
  6381.             (Handler),\
  6382.             sizeof(KSPROPERTY),\
  6383.             0,\
  6384.             NULL, NULL, 0, NULL, NULL, 0)
  6385.  
  6386.     #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NAME(Handler)\
  6387.         DEFINE_KSPROPERTY_ITEM(\
  6388.             KSPROPERTY_TOPOLOGY_NAME,\
  6389.             (Handler),\
  6390.             sizeof(KSP_NODE),\
  6391.             0,\
  6392.             NULL, NULL, 0, NULL, NULL, 0)
  6393.  
  6394.     #define DEFINE_KSPROPERTY_TOPOLOGYSET(TopologySet, Handler)\
  6395.     DEFINE_KSPROPERTY_TABLE(TopologySet) {\
  6396.         DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CATEGORIES(Handler),\
  6397.         DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NODES(Handler),\
  6398.         DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CONNECTIONS(Handler),\
  6399.         DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NAME(Handler)\
  6400.     }
  6401.  
  6402.     //=============================================================================
  6403.  
  6404.     //
  6405.     // properties used by graph manager to talk to particular filters
  6406.     //
  6407.     #if defined(_NTDDK_)
  6408.  
  6409.     #define STATIC_KSPROPSETID_GM \
  6410.         0xAF627536L, 0xE719, 0x11D2, 0x8A, 0x1D, 0x00, 0x60, 0x97, 0xD2, 0xDF, 0x5D    
  6411.     DEFINE_GUIDSTRUCT("AF627536-E719-11D2-8A1D-006097D2DF5D", KSPROPSETID_GM);
  6412.     #define KSPROPSETID_GM DEFINE_GUIDNAMED(KSPROPSETID_GM)
  6413.  
  6414.     typedef VOID (*PFNKSGRAPHMANAGER_NOTIFY)(IN PFILE_OBJECT GraphManager,
  6415.                                              IN ULONG EventId,
  6416.                                              IN PVOID Filter,
  6417.                                              IN PVOID Pin,
  6418.                                              IN PVOID Frame,
  6419.                                              IN ULONG Duration);
  6420.  
  6421.     typedef struct KSGRAPHMANAGER_FUNCTIONTABLE {
  6422.         PFNKSGRAPHMANAGER_NOTIFY NotifyEvent;
  6423.     } KSGRAPHMANAGER_FUNCTIONTABLE, PKSGRAPHMANAGER_FUNCTIONTABLE;
  6424.  
  6425.     typedef struct _KSPROPERTY_GRAPHMANAGER_INTERFACE {
  6426.         PFILE_OBJECT                 GraphManager;
  6427.         KSGRAPHMANAGER_FUNCTIONTABLE FunctionTable;
  6428.     } KSPROPERTY_GRAPHMANAGER_INTERFACE, *PKSPROPERTY_GRAPHMANAGER_INTERFACE;
  6429.  
  6430.  
  6431.     //
  6432.     // Commands
  6433.     //
  6434.     typedef enum {
  6435.         KSPROPERTY_GM_GRAPHMANAGER,    
  6436.         KSPROPERTY_GM_TIMESTAMP_CLOCK, 
  6437.         KSPROPERTY_GM_RATEMATCH,       
  6438.         KSPROPERTY_GM_RENDER_CLOCK,    
  6439.     } KSPROPERTY_GM;
  6440.  
  6441.     #endif
  6442.  
  6443.     //===========================================================================
  6444.  
  6445.  
  6446.     #define STATIC_KSCATEGORY_BRIDGE \
  6447.         0x085AFF00L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  6448.     DEFINE_GUIDSTRUCT("085AFF00-62CE-11CF-A5D6-28DB04C10000", KSCATEGORY_BRIDGE);
  6449.     #define KSCATEGORY_BRIDGE DEFINE_GUIDNAMED(KSCATEGORY_BRIDGE)
  6450.  
  6451.     #define STATIC_KSCATEGORY_CAPTURE \
  6452.         0x65E8773DL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  6453.     DEFINE_GUIDSTRUCT("65E8773D-8F56-11D0-A3B9-00A0C9223196", KSCATEGORY_CAPTURE);
  6454.     #define KSCATEGORY_CAPTURE DEFINE_GUIDNAMED(KSCATEGORY_CAPTURE)
  6455.  
  6456.     #define STATIC_KSCATEGORY_RENDER \
  6457.         0x65E8773EL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  6458.     DEFINE_GUIDSTRUCT("65E8773E-8F56-11D0-A3B9-00A0C9223196", KSCATEGORY_RENDER);
  6459.     #define KSCATEGORY_RENDER DEFINE_GUIDNAMED(KSCATEGORY_RENDER)
  6460.  
  6461.     #define STATIC_KSCATEGORY_MIXER \
  6462.         0xAD809C00L, 0x7B88, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  6463.     DEFINE_GUIDSTRUCT("AD809C00-7B88-11D0-A5D6-28DB04C10000", KSCATEGORY_MIXER);
  6464.     #define KSCATEGORY_MIXER DEFINE_GUIDNAMED(KSCATEGORY_MIXER)
  6465.  
  6466.     #define STATIC_KSCATEGORY_SPLITTER \
  6467.         0x0A4252A0L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  6468.     DEFINE_GUIDSTRUCT("0A4252A0-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_SPLITTER);
  6469.     #define KSCATEGORY_SPLITTER DEFINE_GUIDNAMED(KSCATEGORY_SPLITTER)
  6470.  
  6471.     #define STATIC_KSCATEGORY_DATACOMPRESSOR \
  6472.         0x1E84C900L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  6473.     DEFINE_GUIDSTRUCT("1E84C900-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATACOMPRESSOR);
  6474.     #define KSCATEGORY_DATACOMPRESSOR DEFINE_GUIDNAMED(KSCATEGORY_DATACOMPRESSOR)
  6475.  
  6476.     #define STATIC_KSCATEGORY_DATADECOMPRESSOR \
  6477.         0x2721AE20L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  6478.     DEFINE_GUIDSTRUCT("2721AE20-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATADECOMPRESSOR);
  6479.     #define KSCATEGORY_DATADECOMPRESSOR DEFINE_GUIDNAMED(KSCATEGORY_DATADECOMPRESSOR)
  6480.  
  6481.     #define STATIC_KSCATEGORY_DATATRANSFORM \
  6482.         0x2EB07EA0L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  6483.     DEFINE_GUIDSTRUCT("2EB07EA0-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATATRANSFORM);
  6484.     #define KSCATEGORY_DATATRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_DATATRANSFORM)
  6485.  
  6486.     #define STATIC_KSCATEGORY_COMMUNICATIONSTRANSFORM \
  6487.         0xCF1DDA2CL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  6488.     DEFINE_GUIDSTRUCT("CF1DDA2C-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_COMMUNICATIONSTRANSFORM);
  6489.     #define KSCATEGORY_COMMUNICATIONSTRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_COMMUNICATIONSTRANSFORM)
  6490.  
  6491.     #define STATIC_KSCATEGORY_INTERFACETRANSFORM \
  6492.         0xCF1DDA2DL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  6493.     DEFINE_GUIDSTRUCT("CF1DDA2D-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_INTERFACETRANSFORM);
  6494.     #define KSCATEGORY_INTERFACETRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_INTERFACETRANSFORM)
  6495.  
  6496.     #define STATIC_KSCATEGORY_MEDIUMTRANSFORM \
  6497.         0xCF1DDA2EL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  6498.     DEFINE_GUIDSTRUCT("CF1DDA2E-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_MEDIUMTRANSFORM);
  6499.     #define KSCATEGORY_MEDIUMTRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_MEDIUMTRANSFORM)
  6500.  
  6501.     #define STATIC_KSCATEGORY_FILESYSTEM \
  6502.         0x760FED5EL, 0x9357, 0x11D0, 0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  6503.     DEFINE_GUIDSTRUCT("760FED5E-9357-11D0-A3CC-00A0C9223196", KSCATEGORY_FILESYSTEM);
  6504.     #define KSCATEGORY_FILESYSTEM DEFINE_GUIDNAMED(KSCATEGORY_FILESYSTEM)
  6505.  
  6506.     // KSNAME_Clock
  6507.     #define STATIC_KSCATEGORY_CLOCK \
  6508.         0x53172480L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  6509.     DEFINE_GUIDSTRUCT("53172480-4791-11D0-A5D6-28DB04C10000", KSCATEGORY_CLOCK);
  6510.     #define KSCATEGORY_CLOCK DEFINE_GUIDNAMED(KSCATEGORY_CLOCK)
  6511.  
  6512.     #define STATIC_KSCATEGORY_PROXY \
  6513.         0x97EBAACAL, 0x95BD, 0x11D0, 0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  6514.     DEFINE_GUIDSTRUCT("97EBAACA-95BD-11D0-A3EA-00A0C9223196", KSCATEGORY_PROXY);
  6515.     #define KSCATEGORY_PROXY DEFINE_GUIDNAMED(KSCATEGORY_PROXY)
  6516.  
  6517.     #define STATIC_KSCATEGORY_QUALITY \
  6518.         0x97EBAACBL, 0x95BD, 0x11D0, 0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  6519.     DEFINE_GUIDSTRUCT("97EBAACB-95BD-11D0-A3EA-00A0C9223196", KSCATEGORY_QUALITY);
  6520.     #define KSCATEGORY_QUALITY DEFINE_GUIDNAMED(KSCATEGORY_QUALITY)
  6521.  
  6522.     typedef struct {
  6523.         ULONG   FromNode;
  6524.         ULONG   FromNodePin;
  6525.         ULONG   ToNode;
  6526.         ULONG   ToNodePin;
  6527.     } KSTOPOLOGY_CONNECTION, *PKSTOPOLOGY_CONNECTION;
  6528.  
  6529.     typedef struct {
  6530.         ULONG                           CategoriesCount;
  6531.         const GUID*                     Categories;
  6532.         ULONG                           TopologyNodesCount;
  6533.         const GUID*                     TopologyNodes;
  6534.         ULONG                           TopologyConnectionsCount;
  6535.         const KSTOPOLOGY_CONNECTION*    TopologyConnections;
  6536.         const GUID*                     TopologyNodesNames;
  6537.         ULONG                           Reserved;
  6538.     } KSTOPOLOGY, *PKSTOPOLOGY;
  6539.  
  6540.     #define KSFILTER_NODE   ((ULONG)-1)
  6541.     #define KSALL_NODES     ((ULONG)-1)
  6542.  
  6543.     typedef struct {
  6544.         ULONG       CreateFlags;
  6545.         ULONG       Node;
  6546.     } KSNODE_CREATE, *PKSNODE_CREATE;
  6547.  
  6548.     //===========================================================================
  6549.  
  6550.     // TIME_FORMAT_NONE
  6551.     #define STATIC_KSTIME_FORMAT_NONE       STATIC_GUID_NULL
  6552.     #define KSTIME_FORMAT_NONE              GUID_NULL
  6553.  
  6554.     // TIME_FORMAT_FRAME
  6555.     #define STATIC_KSTIME_FORMAT_FRAME\
  6556.         0x7b785570L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6
  6557.     DEFINE_GUIDSTRUCT("7b785570-8c82-11cf-bc0c-00aa00ac74f6", KSTIME_FORMAT_FRAME);
  6558.     #define KSTIME_FORMAT_FRAME DEFINE_GUIDNAMED(KSTIME_FORMAT_FRAME)
  6559.  
  6560.     // TIME_FORMAT_BYTE             
  6561.     #define STATIC_KSTIME_FORMAT_BYTE\
  6562.         0x7b785571L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6
  6563.     DEFINE_GUIDSTRUCT("7b785571-8c82-11cf-bc0c-00aa00ac74f6", KSTIME_FORMAT_BYTE);
  6564.     #define KSTIME_FORMAT_BYTE DEFINE_GUIDNAMED(KSTIME_FORMAT_BYTE)
  6565.  
  6566.     // TIME_FORMAT_SAMPLE
  6567.     #define STATIC_KSTIME_FORMAT_SAMPLE\
  6568.         0x7b785572L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6
  6569.     DEFINE_GUIDSTRUCT("7b785572-8c82-11cf-bc0c-00aa00ac74f6", KSTIME_FORMAT_SAMPLE);
  6570.     #define KSTIME_FORMAT_SAMPLE DEFINE_GUIDNAMED(KSTIME_FORMAT_SAMPLE)
  6571.  
  6572.     // TIME_FORMAT_FIELD
  6573.     #define STATIC_KSTIME_FORMAT_FIELD\
  6574.         0x7b785573L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6
  6575.     DEFINE_GUIDSTRUCT("7b785573-8c82-11cf-bc0c-00aa00ac74f6", KSTIME_FORMAT_FIELD);
  6576.     #define KSTIME_FORMAT_FIELD DEFINE_GUIDNAMED(KSTIME_FORMAT_FIELD)
  6577.  
  6578.     // TIME_FORMAT_MEDIA_TIME
  6579.     #define STATIC_KSTIME_FORMAT_MEDIA_TIME\
  6580.         0x7b785574L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6
  6581.     DEFINE_GUIDSTRUCT("7b785574-8c82-11cf-bc0c-00aa00ac74f6", KSTIME_FORMAT_MEDIA_TIME);
  6582.     #define KSTIME_FORMAT_MEDIA_TIME DEFINE_GUIDNAMED(KSTIME_FORMAT_MEDIA_TIME)
  6583.  
  6584.     //===========================================================================
  6585.  
  6586.     typedef KSIDENTIFIER KSPIN_INTERFACE, *PKSPIN_INTERFACE;
  6587.  
  6588.     #define STATIC_KSINTERFACESETID_Standard \
  6589.         0x1A8766A0L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  6590.     DEFINE_GUIDSTRUCT("1A8766A0-62CE-11CF-A5D6-28DB04C10000", KSINTERFACESETID_Standard);
  6591.     #define KSINTERFACESETID_Standard DEFINE_GUIDNAMED(KSINTERFACESETID_Standard)
  6592.  
  6593.     typedef enum {
  6594.         KSINTERFACE_STANDARD_STREAMING,
  6595.         KSINTERFACE_STANDARD_LOOPED_STREAMING,
  6596.         KSINTERFACE_STANDARD_CONTROL
  6597.     } KSINTERFACE_STANDARD;
  6598.  
  6599.     #define STATIC_KSINTERFACESETID_FileIo \
  6600.         0x8C6F932CL, 0xE771, 0x11D0, 0xB8, 0xFF, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  6601.     DEFINE_GUIDSTRUCT("8C6F932C-E771-11D0-B8FF-00A0C9223196", KSINTERFACESETID_FileIo);
  6602.     #define KSINTERFACESETID_FileIo DEFINE_GUIDNAMED(KSINTERFACESETID_FileIo)
  6603.  
  6604.     typedef enum {
  6605.         KSINTERFACE_FILEIO_STREAMING
  6606.     } KSINTERFACE_FILEIO;
  6607.  
  6608.     //===========================================================================
  6609.  
  6610.     #define KSMEDIUM_TYPE_ANYINSTANCE       0
  6611.  
  6612.     #define STATIC_KSMEDIUMSETID_Standard \
  6613.         0x4747B320L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  6614.     DEFINE_GUIDSTRUCT("4747B320-62CE-11CF-A5D6-28DB04C10000", KSMEDIUMSETID_Standard);
  6615.     #define KSMEDIUMSETID_Standard DEFINE_GUIDNAMED(KSMEDIUMSETID_Standard)
  6616.  
  6617.     //For compatibility only
  6618.     #define KSMEDIUM_STANDARD_DEVIO     KSMEDIUM_TYPE_ANYINSTANCE
  6619.  
  6620.     //===========================================================================
  6621.  
  6622.     #define STATIC_KSPROPSETID_Pin\
  6623.         0x8C134960L, 0x51AD, 0x11CF, 0x87, 0x8A, 0x94, 0xF8, 0x01, 0xC1, 0x00, 0x00
  6624.     DEFINE_GUIDSTRUCT("8C134960-51AD-11CF-878A-94F801C10000", KSPROPSETID_Pin);
  6625.     #define KSPROPSETID_Pin DEFINE_GUIDNAMED(KSPROPSETID_Pin)
  6626.  
  6627.     typedef enum {
  6628.         KSPROPERTY_PIN_CINSTANCES,
  6629.         KSPROPERTY_PIN_CTYPES,
  6630.         KSPROPERTY_PIN_DATAFLOW,
  6631.         KSPROPERTY_PIN_DATARANGES,
  6632.         KSPROPERTY_PIN_DATAINTERSECTION,
  6633.         KSPROPERTY_PIN_INTERFACES,
  6634.         KSPROPERTY_PIN_MEDIUMS,
  6635.         KSPROPERTY_PIN_COMMUNICATION,
  6636.         KSPROPERTY_PIN_GLOBALCINSTANCES,
  6637.         KSPROPERTY_PIN_NECESSARYINSTANCES,
  6638.         KSPROPERTY_PIN_PHYSICALCONNECTION,
  6639.         KSPROPERTY_PIN_CATEGORY,
  6640.         KSPROPERTY_PIN_NAME,
  6641.         KSPROPERTY_PIN_CONSTRAINEDDATARANGES,
  6642.         KSPROPERTY_PIN_PROPOSEDATAFORMAT
  6643.     } KSPROPERTY_PIN;
  6644.  
  6645.     typedef struct {
  6646.         KSPROPERTY      Property;
  6647.         ULONG           PinId;
  6648.         ULONG           Reserved;
  6649.     } KSP_PIN, *PKSP_PIN;
  6650.  
  6651.     #define KSINSTANCE_INDETERMINATE    ((ULONG)-1)
  6652.  
  6653.     typedef struct {
  6654.         ULONG  PossibleCount;
  6655.         ULONG  CurrentCount;
  6656.     } KSPIN_CINSTANCES, *PKSPIN_CINSTANCES;
  6657.  
  6658.     typedef enum {
  6659.         KSPIN_DATAFLOW_IN = 1,
  6660.         KSPIN_DATAFLOW_OUT
  6661.     } KSPIN_DATAFLOW, *PKSPIN_DATAFLOW;
  6662.  
  6663.     #define KSDATAFORMAT_BIT_TEMPORAL_COMPRESSION   0
  6664.     #define KSDATAFORMAT_TEMPORAL_COMPRESSION       (1 << KSDATAFORMAT_BIT_TEMPORAL_COMPRESSION)
  6665.     #define KSDATAFORMAT_BIT_ATTRIBUTES 1
  6666.     #define KSDATAFORMAT_ATTRIBUTES (1 << KSDATAFORMAT_BIT_ATTRIBUTES)
  6667.  
  6668.     #define KSDATARANGE_BIT_ATTRIBUTES 1
  6669.     #define KSDATARANGE_ATTRIBUTES (1 << KSDATARANGE_BIT_ATTRIBUTES)
  6670.     #define KSDATARANGE_BIT_REQUIRED_ATTRIBUTES 2
  6671.     #define KSDATARANGE_REQUIRED_ATTRIBUTES (1 << KSDATARANGE_BIT_REQUIRED_ATTRIBUTES)
  6672.  
  6673.     #if !defined( _MSC_VER ) 
  6674.     typedef struct {
  6675.         ULONG   FormatSize;
  6676.         ULONG   Flags;
  6677.         ULONG   SampleSize;
  6678.         ULONG   Reserved;
  6679.         GUID    MajorFormat;
  6680.         GUID    SubFormat;
  6681.         GUID    Specifier;
  6682.     } KSDATAFORMAT, *PKSDATAFORMAT, KSDATARANGE, *PKSDATARANGE;
  6683.     #else
  6684.     typedef union {
  6685.         struct {
  6686.             ULONG   FormatSize;
  6687.             ULONG   Flags;
  6688.             ULONG   SampleSize;
  6689.             ULONG   Reserved;
  6690.             GUID    MajorFormat;
  6691.             GUID    SubFormat;
  6692.             GUID    Specifier;
  6693.         };
  6694.         LONGLONG    Alignment;
  6695.     } KSDATAFORMAT, *PKSDATAFORMAT, KSDATARANGE, *PKSDATARANGE;
  6696.     #endif
  6697.  
  6698.     #define KSATTRIBUTE_REQUIRED 0x00000001
  6699.  
  6700.     typedef struct {
  6701.         ULONG Size;
  6702.         ULONG Flags;
  6703.         GUID Attribute;
  6704.     } KSATTRIBUTE, *PKSATTRIBUTE;
  6705.  
  6706.     #if defined(_NTDDK_)
  6707.     typedef struct {
  6708.         ULONG Count;
  6709.         PKSATTRIBUTE* Attributes;
  6710.     } KSATTRIBUTE_LIST, *PKSATTRIBUTE_LIST;
  6711.     #endif // _NTDDK_
  6712.  
  6713.     typedef enum {
  6714.         KSPIN_COMMUNICATION_NONE,
  6715.         KSPIN_COMMUNICATION_SINK,
  6716.         KSPIN_COMMUNICATION_SOURCE,
  6717.         KSPIN_COMMUNICATION_BOTH,
  6718.         KSPIN_COMMUNICATION_BRIDGE
  6719.     } KSPIN_COMMUNICATION, *PKSPIN_COMMUNICATION;
  6720.  
  6721.     typedef KSIDENTIFIER KSPIN_MEDIUM, *PKSPIN_MEDIUM;
  6722.  
  6723.     typedef struct {
  6724.         KSPIN_INTERFACE Interface;
  6725.         KSPIN_MEDIUM    Medium;
  6726.         ULONG           PinId;
  6727.         HANDLE          PinToHandle;
  6728.         KSPRIORITY      Priority;
  6729.     } KSPIN_CONNECT, *PKSPIN_CONNECT;
  6730.  
  6731.     typedef struct {
  6732.         ULONG   Size;
  6733.         ULONG   Pin;
  6734.         WCHAR   SymbolicLinkName[1];
  6735.     } KSPIN_PHYSICALCONNECTION, *PKSPIN_PHYSICALCONNECTION;
  6736.  
  6737.     #if defined(_NTDDK_)
  6738.     typedef
  6739.     NTSTATUS
  6740.     (*PFNKSINTERSECTHANDLER)(
  6741.         IN PIRP Irp,
  6742.         IN PKSP_PIN Pin,
  6743.         IN PKSDATARANGE DataRange,
  6744.         OUT PVOID Data OPTIONAL
  6745.         );
  6746.     typedef
  6747.     NTSTATUS
  6748.     (*PFNKSINTERSECTHANDLEREX)(
  6749.         IN PVOID Context,
  6750.         IN PIRP Irp,
  6751.         IN PKSP_PIN Pin,
  6752.         IN PKSDATARANGE DataRange,
  6753.         IN PKSDATARANGE MatchingDataRange,
  6754.         IN ULONG DataBufferSize,
  6755.         OUT PVOID Data OPTIONAL,
  6756.         OUT PULONG DataSize
  6757.         );
  6758.     #endif // _NTDDK_
  6759.  
  6760.     #define DEFINE_KSPIN_INTERFACE_TABLE(tablename)\
  6761.         const KSPIN_INTERFACE tablename[] =
  6762.  
  6763.     #define DEFINE_KSPIN_INTERFACE_ITEM(guid, interface)\
  6764.         {\
  6765.             STATICGUIDOF(guid),\
  6766.             (interface),\
  6767.             0\
  6768.         }
  6769.  
  6770.     #define DEFINE_KSPIN_MEDIUM_TABLE( tablename )\
  6771.         const KSPIN_MEDIUM tablename[] =
  6772.  
  6773.     #define DEFINE_KSPIN_MEDIUM_ITEM(guid, medium)\
  6774.         DEFINE_KSPIN_INTERFACE_ITEM(guid, medium)
  6775.  
  6776.     #define DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(Handler)\
  6777.         DEFINE_KSPROPERTY_ITEM(\
  6778.             KSPROPERTY_PIN_CINSTANCES,\
  6779.             (Handler),\
  6780.             sizeof(KSP_PIN),\
  6781.             sizeof(KSPIN_CINSTANCES),\
  6782.             NULL, NULL, 0, NULL, NULL, 0)
  6783.  
  6784.     #define DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(Handler)\
  6785.         DEFINE_KSPROPERTY_ITEM(\
  6786.             KSPROPERTY_PIN_CTYPES,\
  6787.             (Handler),\
  6788.             sizeof(KSPROPERTY),\
  6789.             sizeof(ULONG),\
  6790.             NULL, NULL, 0, NULL, NULL, 0)
  6791.  
  6792.     #define DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(Handler)\
  6793.         DEFINE_KSPROPERTY_ITEM(\
  6794.             KSPROPERTY_PIN_DATAFLOW,\
  6795.             (Handler),\
  6796.             sizeof(KSP_PIN),\
  6797.             sizeof(KSPIN_DATAFLOW),\
  6798.             NULL, NULL, 0, NULL, NULL, 0)
  6799.  
  6800.     #define DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(Handler)\
  6801.         DEFINE_KSPROPERTY_ITEM(\
  6802.             KSPROPERTY_PIN_DATARANGES,\
  6803.             (Handler),\
  6804.             sizeof(KSP_PIN),\
  6805.             0,\
  6806.             NULL, NULL, 0, NULL, NULL, 0)
  6807.  
  6808.     #define DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(Handler)\
  6809.         DEFINE_KSPROPERTY_ITEM(\
  6810.             KSPROPERTY_PIN_DATAINTERSECTION,\
  6811.             (Handler),\
  6812.             sizeof(KSP_PIN) + sizeof(KSMULTIPLE_ITEM),\
  6813.             0,\
  6814.             NULL, NULL, 0, NULL, NULL, 0)
  6815.  
  6816.     #define DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(Handler)\
  6817.         DEFINE_KSPROPERTY_ITEM(\
  6818.             KSPROPERTY_PIN_INTERFACES,\
  6819.             (Handler),\
  6820.             sizeof(KSP_PIN),\
  6821.             0,\
  6822.             NULL, NULL, 0, NULL, NULL, 0)
  6823.  
  6824.     #define DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(Handler)\
  6825.         DEFINE_KSPROPERTY_ITEM(\
  6826.             KSPROPERTY_PIN_MEDIUMS,\
  6827.             (Handler),\
  6828.             sizeof(KSP_PIN),\
  6829.             0,\
  6830.             NULL, NULL, 0, NULL, NULL, 0)
  6831.  
  6832.     #define DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(Handler)\
  6833.         DEFINE_KSPROPERTY_ITEM(\
  6834.             KSPROPERTY_PIN_COMMUNICATION,\
  6835.             (Handler),\
  6836.             sizeof(KSP_PIN),\
  6837.             sizeof(KSPIN_COMMUNICATION),\
  6838.             NULL, NULL, 0, NULL, NULL, 0)
  6839.  
  6840.     #define DEFINE_KSPROPERTY_ITEM_PIN_GLOBALCINSTANCES(Handler)\
  6841.         DEFINE_KSPROPERTY_ITEM(\
  6842.             KSPROPERTY_PIN_GLOBALCINSTANCES,\
  6843.             (Handler),\
  6844.             sizeof(KSP_PIN),\
  6845.             sizeof(KSPIN_CINSTANCES),\
  6846.             NULL, NULL, 0, NULL, NULL, 0)
  6847.  
  6848.     #define DEFINE_KSPROPERTY_ITEM_PIN_NECESSARYINSTANCES(Handler)\
  6849.         DEFINE_KSPROPERTY_ITEM(\
  6850.             KSPROPERTY_PIN_NECESSARYINSTANCES,\
  6851.             (Handler),\
  6852.             sizeof(KSP_PIN),\
  6853.             sizeof(ULONG),\
  6854.             NULL, NULL, 0, NULL, NULL, 0)
  6855.  
  6856.     #define DEFINE_KSPROPERTY_ITEM_PIN_PHYSICALCONNECTION(Handler)\
  6857.         DEFINE_KSPROPERTY_ITEM(\
  6858.             KSPROPERTY_PIN_PHYSICALCONNECTION,\
  6859.             (Handler),\
  6860.             sizeof(KSP_PIN),\
  6861.             0,\
  6862.             NULL, NULL, 0, NULL, NULL, 0)
  6863.  
  6864.     #define DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(Handler)\
  6865.         DEFINE_KSPROPERTY_ITEM(\
  6866.             KSPROPERTY_PIN_CATEGORY,\
  6867.             (Handler),\
  6868.             sizeof(KSP_PIN),\
  6869.             sizeof(GUID),\
  6870.             NULL, NULL, 0, NULL, NULL, 0)
  6871.  
  6872.     #define DEFINE_KSPROPERTY_ITEM_PIN_NAME(Handler)\
  6873.         DEFINE_KSPROPERTY_ITEM(\
  6874.             KSPROPERTY_PIN_NAME,\
  6875.             (Handler),\
  6876.             sizeof(KSP_PIN),\
  6877.             0,\
  6878.             NULL, NULL, 0, NULL, NULL, 0)
  6879.  
  6880.     #define DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(Handler)\
  6881.         DEFINE_KSPROPERTY_ITEM(\
  6882.             KSPROPERTY_PIN_CONSTRAINEDDATARANGES,\
  6883.             (Handler),\
  6884.             sizeof(KSP_PIN),\
  6885.             0,\
  6886.             NULL, NULL, 0, NULL, NULL, 0)
  6887.  
  6888.     #define DEFINE_KSPROPERTY_ITEM_PIN_PROPOSEDATAFORMAT(Handler)\
  6889.         DEFINE_KSPROPERTY_ITEM(\
  6890.             KSPROPERTY_PIN_PROPOSEDATAFORMAT,\
  6891.             NULL,\
  6892.             sizeof(KSP_PIN),\
  6893.             sizeof(KSDATAFORMAT),\
  6894.             (Handler), NULL, 0, NULL, NULL, 0)
  6895.  
  6896.     #define DEFINE_KSPROPERTY_PINSET(PinSet,\
  6897.         PropGeneral, PropInstances, PropIntersection)\
  6898.     DEFINE_KSPROPERTY_TABLE(PinSet) {\
  6899.         DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(PropInstances),\
  6900.         DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(PropGeneral),\
  6901.         DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(PropGeneral),\
  6902.         DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(PropGeneral),\
  6903.         DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(PropIntersection),\
  6904.         DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(PropGeneral),\
  6905.         DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(PropGeneral),\
  6906.         DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(PropGeneral),\
  6907.         DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(PropGeneral),\
  6908.         DEFINE_KSPROPERTY_ITEM_PIN_NAME(PropGeneral)\
  6909.     }
  6910.  
  6911.     #define DEFINE_KSPROPERTY_PINSETCONSTRAINED(PinSet,\
  6912.         PropGeneral, PropInstances, PropIntersection)\
  6913.     DEFINE_KSPROPERTY_TABLE(PinSet) {\
  6914.         DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(PropInstances),\
  6915.         DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(PropGeneral),\
  6916.         DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(PropGeneral),\
  6917.         DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(PropGeneral),\
  6918.         DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(PropIntersection),\
  6919.         DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(PropGeneral),\
  6920.         DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(PropGeneral),\
  6921.         DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(PropGeneral),\
  6922.         DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(PropGeneral),\
  6923.         DEFINE_KSPROPERTY_ITEM_PIN_NAME(PropGeneral),\
  6924.         DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(PropGeneral)\
  6925.     }
  6926.  
  6927.     #define STATIC_KSNAME_Filter\
  6928.         0x9b365890L, 0x165f, 0x11d0, 0xa1, 0x95, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
  6929.     DEFINE_GUIDSTRUCT("9b365890-165f-11d0-a195-0020afd156e4", KSNAME_Filter);
  6930.     #define KSNAME_Filter DEFINE_GUIDNAMED(KSNAME_Filter)
  6931.  
  6932.     #define KSSTRING_Filter L"{9B365890-165F-11D0-A195-0020AFD156E4}"
  6933.  
  6934.     #define STATIC_KSNAME_Pin\
  6935.         0x146F1A80L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  6936.     DEFINE_GUIDSTRUCT("146F1A80-4791-11D0-A5D6-28DB04C10000", KSNAME_Pin);
  6937.     #define KSNAME_Pin DEFINE_GUIDNAMED(KSNAME_Pin)
  6938.  
  6939.     #define KSSTRING_Pin L"{146F1A80-4791-11D0-A5D6-28DB04C10000}"
  6940.  
  6941.     #define STATIC_KSNAME_Clock\
  6942.         0x53172480L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  6943.     DEFINE_GUIDSTRUCT("53172480-4791-11D0-A5D6-28DB04C10000", KSNAME_Clock);
  6944.     #define KSNAME_Clock DEFINE_GUIDNAMED(KSNAME_Clock)
  6945.  
  6946.     #define KSSTRING_Clock L"{53172480-4791-11D0-A5D6-28DB04C10000}"
  6947.  
  6948.     #define STATIC_KSNAME_Allocator\
  6949.         0x642F5D00L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  6950.     DEFINE_GUIDSTRUCT("642F5D00-4791-11D0-A5D6-28DB04C10000", KSNAME_Allocator);
  6951.     #define KSNAME_Allocator DEFINE_GUIDNAMED(KSNAME_Allocator)
  6952.  
  6953.     #define KSSTRING_Allocator L"{642F5D00-4791-11D0-A5D6-28DB04C10000}"
  6954.  
  6955.     #define KSSTRING_AllocatorEx L"{091BB63B-603F-11D1-B067-00A0C9062802}"
  6956.  
  6957.     #define STATIC_KSNAME_TopologyNode\
  6958.         0x0621061AL, 0xEE75, 0x11D0, 0xB9, 0x15, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  6959.     DEFINE_GUIDSTRUCT("0621061A-EE75-11D0-B915-00A0C9223196", KSNAME_TopologyNode);
  6960.     #define KSNAME_TopologyNode DEFINE_GUIDNAMED(KSNAME_TopologyNode)
  6961.  
  6962.     #define KSSTRING_TopologyNode L"{0621061A-EE75-11D0-B915-00A0C9223196}"
  6963.  
  6964.     #if defined(_NTDDK_)
  6965.  
  6966.     typedef struct {
  6967.         ULONG                   InterfacesCount;
  6968.         const KSPIN_INTERFACE*  Interfaces;
  6969.         ULONG                   MediumsCount;
  6970.         const KSPIN_MEDIUM*     Mediums;
  6971.         ULONG                   DataRangesCount;
  6972.         const PKSDATARANGE*     DataRanges;
  6973.         KSPIN_DATAFLOW          DataFlow;
  6974.         KSPIN_COMMUNICATION     Communication;
  6975.         const GUID*             Category;
  6976.         const GUID*             Name;
  6977.         union {
  6978.             LONGLONG            Reserved;
  6979.             struct {
  6980.                 ULONG           ConstrainedDataRangesCount;
  6981.                 PKSDATARANGE*   ConstrainedDataRanges;
  6982.             };
  6983.         };
  6984.     } KSPIN_DESCRIPTOR, *PKSPIN_DESCRIPTOR;
  6985.     typedef const KSPIN_DESCRIPTOR *PCKSPIN_DESCRIPTOR;
  6986.  
  6987.     #define DEFINE_KSPIN_DESCRIPTOR_TABLE(tablename)\
  6988.         const KSPIN_DESCRIPTOR tablename[] =
  6989.  
  6990.     #define DEFINE_KSPIN_DESCRIPTOR_ITEM(\
  6991.         InterfacesCount, Interfaces,\
  6992.         MediumsCount, Mediums,\
  6993.         DataRangesCount, DataRanges,\
  6994.         DataFlow, Communication)\
  6995.     {\
  6996.         InterfacesCount, Interfaces, MediumsCount, Mediums,\
  6997.         DataRangesCount, DataRanges, DataFlow, Communication,\
  6998.         NULL, NULL, 0\
  6999.     }
  7000.     #define DEFINE_KSPIN_DESCRIPTOR_ITEMEX(\
  7001.         InterfacesCount, Interfaces,\
  7002.         MediumsCount, Mediums,\
  7003.         DataRangesCount, DataRanges,\
  7004.         DataFlow, Communication,\
  7005.         Category, Name)\
  7006.     {\
  7007.         InterfacesCount, Interfaces, MediumsCount, Mediums,\
  7008.         DataRangesCount, DataRanges, DataFlow, Communication,\
  7009.         Category, Name, 0\
  7010.     }
  7011.  
  7012.     #endif // defined(_NTDDK_)
  7013.  
  7014.     //===========================================================================
  7015.  
  7016.     // MEDIATYPE_NULL
  7017.     #define STATIC_KSDATAFORMAT_TYPE_WILDCARD       STATIC_GUID_NULL
  7018.     #define KSDATAFORMAT_TYPE_WILDCARD              GUID_NULL
  7019.  
  7020.     // MEDIASUBTYPE_NULL
  7021.     #define STATIC_KSDATAFORMAT_SUBTYPE_WILDCARD    STATIC_GUID_NULL
  7022.     #define KSDATAFORMAT_SUBTYPE_WILDCARD           GUID_NULL
  7023.  
  7024.     // MEDIATYPE_Stream
  7025.     #define STATIC_KSDATAFORMAT_TYPE_STREAM\
  7026.         0xE436EB83L, 0x524F, 0x11CE, 0x9F, 0x53, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70
  7027.     DEFINE_GUIDSTRUCT("E436EB83-524F-11CE-9F53-0020AF0BA770", KSDATAFORMAT_TYPE_STREAM);
  7028.     #define KSDATAFORMAT_TYPE_STREAM DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_STREAM)
  7029.  
  7030.     // MEDIASUBTYPE_None
  7031.     #define STATIC_KSDATAFORMAT_SUBTYPE_NONE\
  7032.         0xE436EB8EL, 0x524F, 0x11CE, 0x9F, 0x53, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70
  7033.     DEFINE_GUIDSTRUCT("E436EB8E-524F-11CE-9F53-0020AF0BA770", KSDATAFORMAT_SUBTYPE_NONE);
  7034.     #define KSDATAFORMAT_SUBTYPE_NONE DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_NONE)
  7035.  
  7036.     #define STATIC_KSDATAFORMAT_SPECIFIER_WILDCARD  STATIC_GUID_NULL
  7037.     #define KSDATAFORMAT_SPECIFIER_WILDCARD         GUID_NULL
  7038.  
  7039.     #define STATIC_KSDATAFORMAT_SPECIFIER_FILENAME\
  7040.         0xAA797B40L, 0xE974, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  7041.     DEFINE_GUIDSTRUCT("AA797B40-E974-11CF-A5D6-28DB04C10000", KSDATAFORMAT_SPECIFIER_FILENAME);
  7042.     #define KSDATAFORMAT_SPECIFIER_FILENAME DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_FILENAME)
  7043.  
  7044.     #define STATIC_KSDATAFORMAT_SPECIFIER_FILEHANDLE\
  7045.         0x65E8773CL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  7046.     DEFINE_GUIDSTRUCT("65E8773C-8F56-11D0-A3B9-00A0C9223196", KSDATAFORMAT_SPECIFIER_FILEHANDLE);
  7047.     #define KSDATAFORMAT_SPECIFIER_FILEHANDLE DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_FILEHANDLE)
  7048.  
  7049.     // FORMAT_None
  7050.     #define STATIC_KSDATAFORMAT_SPECIFIER_NONE\
  7051.         0x0F6417D6L, 0xC318, 0x11D0, 0xA4, 0x3F, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  7052.     DEFINE_GUIDSTRUCT("0F6417D6-C318-11D0-A43F-00A0C9223196", KSDATAFORMAT_SPECIFIER_NONE);
  7053.     #define KSDATAFORMAT_SPECIFIER_NONE DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_NONE)
  7054.  
  7055.     //===========================================================================
  7056.  
  7057.     #define STATIC_KSPROPSETID_Quality \
  7058.         0xD16AD380L, 0xAC1A, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  7059.     DEFINE_GUIDSTRUCT("D16AD380-AC1A-11CF-A5D6-28DB04C10000", KSPROPSETID_Quality);
  7060.     #define KSPROPSETID_Quality DEFINE_GUIDNAMED(KSPROPSETID_Quality)
  7061.  
  7062.     typedef enum {
  7063.         KSPROPERTY_QUALITY_REPORT,
  7064.         KSPROPERTY_QUALITY_ERROR
  7065.     } KSPROPERTY_QUALITY;
  7066.  
  7067.     #define DEFINE_KSPROPERTY_ITEM_QUALITY_REPORT(GetHandler, SetHandler)\
  7068.         DEFINE_KSPROPERTY_ITEM(\
  7069.             KSPROPERTY_QUALITY_REPORT,\
  7070.             (GetHandler),\
  7071.             sizeof(KSPROPERTY),\
  7072.             sizeof(KSQUALITY),\
  7073.             (SetHandler),\
  7074.             NULL, 0, NULL, NULL, 0)
  7075.  
  7076.     #define DEFINE_KSPROPERTY_ITEM_QUALITY_ERROR(GetHandler, SetHandler)\
  7077.         DEFINE_KSPROPERTY_ITEM(\
  7078.             KSPROPERTY_QUALITY_ERROR,\
  7079.             (GetHandler),\
  7080.             sizeof(KSPROPERTY),\
  7081.             sizeof(KSERROR),\
  7082.             (SetHandler),\
  7083.             NULL, 0, NULL, NULL, 0)
  7084.  
  7085.     //===========================================================================
  7086.  
  7087.     #define STATIC_KSPROPSETID_Connection \
  7088.         0x1D58C920L, 0xAC9B, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  7089.     DEFINE_GUIDSTRUCT("1D58C920-AC9B-11CF-A5D6-28DB04C10000", KSPROPSETID_Connection);
  7090.     #define KSPROPSETID_Connection DEFINE_GUIDNAMED(KSPROPSETID_Connection)
  7091.  
  7092.     typedef enum {
  7093.         KSPROPERTY_CONNECTION_STATE,
  7094.         KSPROPERTY_CONNECTION_PRIORITY,
  7095.         KSPROPERTY_CONNECTION_DATAFORMAT,
  7096.         KSPROPERTY_CONNECTION_ALLOCATORFRAMING,
  7097.         KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT,
  7098.         KSPROPERTY_CONNECTION_ACQUIREORDERING,
  7099.         KSPROPERTY_CONNECTION_ALLOCATORFRAMING_EX,
  7100.         KSPROPERTY_CONNECTION_STARTAT
  7101.     } KSPROPERTY_CONNECTION;
  7102.  
  7103.     #define DEFINE_KSPROPERTY_ITEM_CONNECTION_STATE(GetHandler, SetHandler)\
  7104.         DEFINE_KSPROPERTY_ITEM(\
  7105.             KSPROPERTY_CONNECTION_STATE,\
  7106.             (GetHandler),\
  7107.             sizeof(KSPROPERTY),\
  7108.             sizeof(KSSTATE),\
  7109.             (SetHandler),\
  7110.             NULL, 0, NULL, NULL, 0)
  7111.  
  7112.     #define DEFINE_KSPROPERTY_ITEM_CONNECTION_PRIORITY(GetHandler, SetHandler)\
  7113.         DEFINE_KSPROPERTY_ITEM(\
  7114.             KSPROPERTY_CONNECTION_PRIORITY,\
  7115.             (GetHandler),\
  7116.             sizeof(KSPROPERTY),\
  7117.             sizeof(KSPRIORITY),\
  7118.             (SetHandler),\
  7119.             NULL, 0, NULL, NULL, 0)
  7120.  
  7121.     #define DEFINE_KSPROPERTY_ITEM_CONNECTION_DATAFORMAT(GetHandler, SetHandler)\
  7122.         DEFINE_KSPROPERTY_ITEM(\
  7123.             KSPROPERTY_CONNECTION_DATAFORMAT,\
  7124.             (GetHandler),\
  7125.             sizeof(KSPROPERTY),\
  7126.             0,\
  7127.             (SetHandler),\
  7128.             NULL, 0, NULL, NULL, 0)
  7129.  
  7130.     #define DEFINE_KSPROPERTY_ITEM_CONNECTION_ALLOCATORFRAMING(Handler)\
  7131.         DEFINE_KSPROPERTY_ITEM(\
  7132.             KSPROPERTY_CONNECTION_ALLOCATORFRAMING,\
  7133.             (Handler),\
  7134.             sizeof(KSPROPERTY),\
  7135.             sizeof(KSALLOCATOR_FRAMING),\
  7136.             NULL, NULL, 0, NULL, NULL, 0)
  7137.         
  7138.     #define DEFINE_KSPROPERTY_ITEM_CONNECTION_ALLOCATORFRAMING_EX(Handler)\
  7139.         DEFINE_KSPROPERTY_ITEM(\
  7140.             KSPROPERTY_CONNECTION_ALLOCATORFRAMING_EX,\
  7141.             (Handler),\
  7142.             sizeof(KSPROPERTY),\
  7143.             sizeof(KSALLOCATOR_FRAMING_EX),\
  7144.             NULL, NULL, 0, NULL, NULL, 0)
  7145.  
  7146.     #define DEFINE_KSPROPERTY_ITEM_CONNECTION_PROPOSEDATAFORMAT(Handler)\
  7147.         DEFINE_KSPROPERTY_ITEM(\
  7148.             KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT,\
  7149.             NULL,\
  7150.             sizeof(KSPROPERTY),\
  7151.             sizeof(KSDATAFORMAT),\
  7152.             (Handler),\
  7153.             NULL, 0, NULL, NULL, 0)
  7154.  
  7155.     #define DEFINE_KSPROPERTY_ITEM_CONNECTION_ACQUIREORDERING(Handler)\
  7156.         DEFINE_KSPROPERTY_ITEM(\
  7157.             KSPROPERTY_CONNECTION_ACQUIREORDERING,\
  7158.             (Handler),\
  7159.             sizeof(KSPROPERTY),\
  7160.             sizeof(int),\
  7161.             NULL, NULL, 0, NULL, NULL, 0)
  7162.  
  7163.     #define DEFINE_KSPROPERTY_ITEM_CONNECTION_STARTAT(Handler)\
  7164.         DEFINE_KSPROPERTY_ITEM(\
  7165.             KSPROPERTY_CONNECTION_STARTAT,\
  7166.             NULL,\
  7167.             sizeof(KSPROPERTY),\
  7168.             sizeof(KSRELATIVEEVENT),\
  7169.             (Handler),\
  7170.             NULL, 0, NULL, NULL, 0)
  7171.  
  7172.     //===========================================================================
  7173.     //
  7174.     // pins flags
  7175.     //
  7176.     #define KSALLOCATOR_REQUIREMENTF_INPLACE_MODIFIER   0x00000001
  7177.     #define KSALLOCATOR_REQUIREMENTF_SYSTEM_MEMORY      0x00000002
  7178.     #define KSALLOCATOR_REQUIREMENTF_FRAME_INTEGRITY    0x00000004
  7179.     #define KSALLOCATOR_REQUIREMENTF_MUST_ALLOCATE      0x00000008
  7180.     #define KSALLOCATOR_REQUIREMENTF_PREFERENCES_ONLY   0x80000000
  7181.  
  7182.     #define KSALLOCATOR_OPTIONF_COMPATIBLE              0x00000001
  7183.     #define KSALLOCATOR_OPTIONF_SYSTEM_MEMORY           0x00000002
  7184.     #define KSALLOCATOR_OPTIONF_VALID                   0x00000003
  7185.     // 
  7186.     // pins extended framing flags
  7187.     //
  7188.     #define KSALLOCATOR_FLAG_PARTIAL_READ_SUPPORT       0x00000010
  7189.     #define KSALLOCATOR_FLAG_DEVICE_SPECIFIC            0x00000020
  7190.     #define KSALLOCATOR_FLAG_CAN_ALLOCATE               0x00000040
  7191.     #define KSALLOCATOR_FLAG_INSIST_ON_FRAMESIZE_RATIO  0x00000080
  7192.     //
  7193.     // allocator pipes flags
  7194.     //
  7195.     // there is at least one data modification in a pipe
  7196.     #define KSALLOCATOR_FLAG_NO_FRAME_INTEGRITY         0x00000100
  7197.     #define KSALLOCATOR_FLAG_MULTIPLE_OUTPUT            0x00000200
  7198.     #define KSALLOCATOR_FLAG_CYCLE                      0x00000400
  7199.     #define KSALLOCATOR_FLAG_ALLOCATOR_EXISTS           0x00000800
  7200.     // there is no framing dependency between neighbouring pipes.
  7201.     #define KSALLOCATOR_FLAG_INDEPENDENT_RANGES         0x00001000
  7202.     #define KSALLOCATOR_FLAG_ATTENTION_STEPPING         0x00002000
  7203.  
  7204.  
  7205.     //
  7206.     // old Framing structure
  7207.     //
  7208.     typedef struct {
  7209.         union {
  7210.             ULONG       OptionsFlags;       // allocator options (create)
  7211.             ULONG       RequirementsFlags;  // allocation requirements (query)
  7212.         };
  7213.     #if defined(_NTDDK_)
  7214.         POOL_TYPE   PoolType;
  7215.     #else // !_NTDDK_
  7216.         ULONG       PoolType;
  7217.     #endif // !_NTDDK_
  7218.         ULONG       Frames;     // total number of allowable outstanding frames
  7219.         ULONG       FrameSize;  // total size of frame
  7220.         ULONG       FileAlignment;
  7221.         ULONG       Reserved;
  7222.     } KSALLOCATOR_FRAMING, *PKSALLOCATOR_FRAMING;
  7223.  
  7224.     #if defined(_NTDDK_)
  7225.     typedef
  7226.     PVOID
  7227.     (*PFNKSDEFAULTALLOCATE)(
  7228.         IN PVOID Context
  7229.         );
  7230.  
  7231.     typedef
  7232.     VOID
  7233.     (*PFNKSDEFAULTFREE)(
  7234.         IN PVOID Context,
  7235.         IN PVOID Buffer
  7236.         );
  7237.  
  7238.     typedef
  7239.     NTSTATUS
  7240.     (*PFNKSINITIALIZEALLOCATOR)(
  7241.         IN PVOID InitialContext,
  7242.         IN PKSALLOCATOR_FRAMING AllocatorFraming,
  7243.         OUT PVOID* Context
  7244.         );
  7245.  
  7246.     typedef
  7247.     VOID
  7248.     (*PFNKSDELETEALLOCATOR)(
  7249.         IN PVOID Context
  7250.         );
  7251.     #endif // !_NTDDK_
  7252.  
  7253.     //
  7254.     // new Framing structure, eventually will replace KSALLOCATOR_FRAMING.
  7255.     // 
  7256.     typedef struct {
  7257.         ULONG   MinFrameSize;
  7258.         ULONG   MaxFrameSize;
  7259.         ULONG   Stepping;
  7260.     } KS_FRAMING_RANGE, *PKS_FRAMING_RANGE;
  7261.  
  7262.  
  7263.     typedef struct {
  7264.         KS_FRAMING_RANGE  Range;
  7265.         ULONG             InPlaceWeight;
  7266.         ULONG             NotInPlaceWeight;
  7267.     } KS_FRAMING_RANGE_WEIGHTED, *PKS_FRAMING_RANGE_WEIGHTED;
  7268.  
  7269.  
  7270.     typedef struct {
  7271.         ULONG   RatioNumerator;      // compression/expansion ratio
  7272.         ULONG   RatioDenominator; 
  7273.         ULONG   RatioConstantMargin;
  7274.     } KS_COMPRESSION, *PKS_COMPRESSION;
  7275.  
  7276.  
  7277.     //
  7278.     // Memory Types and Buses are repeated in each entry.
  7279.     // Easiest to use but takes a little more memory than the varsize layout Pin\Memories\Buses\Ranges.
  7280.     //
  7281.     typedef struct {
  7282.         GUID                        MemoryType;
  7283.         GUID                        BusType;
  7284.         ULONG                       MemoryFlags;
  7285.         ULONG                       BusFlags;   
  7286.         ULONG                       Flags;   
  7287.         ULONG                       Frames;              // total number of allowable outstanding frames
  7288.         ULONG                       FileAlignment;
  7289.         ULONG                       MemoryTypeWeight;    // this memory type Weight pin-wide
  7290.         KS_FRAMING_RANGE            PhysicalRange;
  7291.         KS_FRAMING_RANGE_WEIGHTED   FramingRange; 
  7292.     } KS_FRAMING_ITEM, *PKS_FRAMING_ITEM;
  7293.  
  7294.  
  7295.     typedef struct {
  7296.         ULONG               CountItems;         // count of FramingItem-s below.
  7297.         ULONG               PinFlags;
  7298.         KS_COMPRESSION      OutputCompression;
  7299.         ULONG               PinWeight;          // this pin framing's Weight graph-wide
  7300.         KS_FRAMING_ITEM     FramingItem[1]; 
  7301.     } KSALLOCATOR_FRAMING_EX, *PKSALLOCATOR_FRAMING_EX;
  7302.  
  7303.  
  7304.  
  7305.     //
  7306.     // define memory type GUIDs
  7307.     //
  7308.     #define KSMEMORY_TYPE_WILDCARD          GUID_NULL
  7309.     #define STATIC_KSMEMORY_TYPE_WILDCARD   STATIC_GUID_NULL
  7310.  
  7311.     #define KSMEMORY_TYPE_DONT_CARE         GUID_NULL
  7312.     #define STATIC_KSMEMORY_TYPE_DONT_CARE  STATIC_GUID_NULL
  7313.  
  7314.     #define KS_TYPE_DONT_CARE           GUID_NULL
  7315.     #define STATIC_KS_TYPE_DONT_CARE    STATIC_GUID_NULL
  7316.      
  7317.     #define STATIC_KSMEMORY_TYPE_SYSTEM \
  7318.         0x091bb638L, 0x603f, 0x11d1, 0xb0, 0x67, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02
  7319.     DEFINE_GUIDSTRUCT("091bb638-603f-11d1-b067-00a0c9062802", KSMEMORY_TYPE_SYSTEM);
  7320.     #define KSMEMORY_TYPE_SYSTEM  DEFINE_GUIDNAMED(KSMEMORY_TYPE_SYSTEM)
  7321.  
  7322.     #define STATIC_KSMEMORY_TYPE_USER \
  7323.         0x8cb0fc28L, 0x7893, 0x11d1, 0xb0, 0x69, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02
  7324.     DEFINE_GUIDSTRUCT("8cb0fc28-7893-11d1-b069-00a0c9062802", KSMEMORY_TYPE_USER);
  7325.     #define KSMEMORY_TYPE_USER  DEFINE_GUIDNAMED(KSMEMORY_TYPE_USER)
  7326.  
  7327.     #define STATIC_KSMEMORY_TYPE_KERNEL_PAGED \
  7328.         0xd833f8f8L, 0x7894, 0x11d1, 0xb0, 0x69, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02
  7329.     DEFINE_GUIDSTRUCT("d833f8f8-7894-11d1-b069-00a0c9062802", KSMEMORY_TYPE_KERNEL_PAGED);
  7330.     #define KSMEMORY_TYPE_KERNEL_PAGED  DEFINE_GUIDNAMED(KSMEMORY_TYPE_KERNEL_PAGED)
  7331.  
  7332.     #define STATIC_KSMEMORY_TYPE_KERNEL_NONPAGED \
  7333.         0x4a6d5fc4L, 0x7895, 0x11d1, 0xb0, 0x69, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02
  7334.     DEFINE_GUIDSTRUCT("4a6d5fc4-7895-11d1-b069-00a0c9062802", KSMEMORY_TYPE_KERNEL_NONPAGED);
  7335.     #define KSMEMORY_TYPE_KERNEL_NONPAGED  DEFINE_GUIDNAMED(KSMEMORY_TYPE_KERNEL_NONPAGED)
  7336.  
  7337.     // old KS clients did not specify the device memory type
  7338.     #define STATIC_KSMEMORY_TYPE_DEVICE_UNKNOWN \
  7339.         0x091bb639L, 0x603f, 0x11d1, 0xb0, 0x67, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02
  7340.     DEFINE_GUIDSTRUCT("091bb639-603f-11d1-b067-00a0c9062802", KSMEMORY_TYPE_DEVICE_UNKNOWN);
  7341.     #define KSMEMORY_TYPE_DEVICE_UNKNOWN DEFINE_GUIDNAMED(KSMEMORY_TYPE_DEVICE_UNKNOWN)
  7342.  
  7343.     //
  7344.     // Helper framing macros.
  7345.     //
  7346.     #define DECLARE_SIMPLE_FRAMING_EX(FramingExName, MemoryType, Flags, Frames, Alignment, MinFrameSize, MaxFrameSize) \
  7347.         const KSALLOCATOR_FRAMING_EX FramingExName = \
  7348.         {\
  7349.             1, \
  7350.             0, \
  7351.             {\
  7352.                 1, \
  7353.                 1, \
  7354.                 0 \
  7355.             }, \
  7356.             0, \
  7357.             {\
  7358.                 {\
  7359.                     MemoryType, \
  7360.                     STATIC_KS_TYPE_DONT_CARE, \
  7361.                     0, \
  7362.                     0, \
  7363.                     Flags, \
  7364.                     Frames, \
  7365.                     Alignment, \
  7366.                     0, \
  7367.                     {\
  7368.                         0, \
  7369.                         (ULONG)-1, \
  7370.                         1 \
  7371.                     }, \
  7372.                     {\
  7373.                         {\
  7374.                             MinFrameSize, \
  7375.                             MaxFrameSize, \
  7376.                             1 \
  7377.                         }, \
  7378.                         0, \
  7379.                         0  \
  7380.                     }\
  7381.                 }\
  7382.             }\
  7383.         }
  7384.  
  7385.     #define SetDefaultKsCompression(KsCompressionPointer) \
  7386.     {\
  7387.         KsCompressionPointer->RatioNumerator = 1;\
  7388.         KsCompressionPointer->RatioDenominator = 1;\
  7389.         KsCompressionPointer->RatioConstantMargin = 0;\
  7390.     }
  7391.  
  7392.     #define SetDontCareKsFramingRange(KsFramingRangePointer) \
  7393.     {\
  7394.         KsFramingRangePointer->MinFrameSize = 0;\
  7395.         KsFramingRangePointer->MaxFrameSize = (ULONG) -1;\
  7396.         KsFramingRangePointer->Stepping = 1;\
  7397.     }
  7398.  
  7399.     #define SetKsFramingRange(KsFramingRangePointer, P_MinFrameSize, P_MaxFrameSize) \
  7400.     {\
  7401.         KsFramingRangePointer->MinFrameSize = P_MinFrameSize;\
  7402.         KsFramingRangePointer->MaxFrameSize = P_MaxFrameSize;\
  7403.         KsFramingRangePointer->Stepping = 1;\
  7404.     }
  7405.  
  7406.     #define SetKsFramingRangeWeighted(KsFramingRangeWeightedPointer, P_MinFrameSize, P_MaxFrameSize) \
  7407.     {\
  7408.         KS_FRAMING_RANGE *KsFramingRange = &KsFramingRangeWeightedPointer->Range;\
  7409.         SetKsFramingRange(KsFramingRange, P_MinFrameSize, P_MaxFrameSize);\
  7410.         KsFramingRangeWeightedPointer->InPlaceWeight = 0;\
  7411.         KsFramingRangeWeightedPointer->NotInPlaceWeight = 0;\
  7412.     }
  7413.  
  7414.     #define INITIALIZE_SIMPLE_FRAMING_EX(FramingExPointer, P_MemoryType, P_Flags, P_Frames, P_Alignment, P_MinFrameSize, P_MaxFrameSize) \
  7415.     {\
  7416.         KS_COMPRESSION *KsCompression = &FramingExPointer->OutputCompression;\
  7417.         KS_FRAMING_RANGE *KsFramingRange = &FramingExPointer->FramingItem[0].PhysicalRange;\
  7418.         KS_FRAMING_RANGE_WEIGHTED *KsFramingRangeWeighted = &FramingExPointer->FramingItem[0].FramingRange;\
  7419.         FramingExPointer->CountItems = 1;\
  7420.         FramingExPointer->PinFlags = 0;\
  7421.         SetDefaultKsCompression(KsCompression);\
  7422.         FramingExPointer->PinWeight = 0;\
  7423.         FramingExPointer->FramingItem[0].MemoryType = P_MemoryType;\
  7424.         FramingExPointer->FramingItem[0].BusType = KS_TYPE_DONT_CARE;\
  7425.         FramingExPointer->FramingItem[0].MemoryFlags = 0;\
  7426.         FramingExPointer->FramingItem[0].BusFlags = 0;\
  7427.         FramingExPointer->FramingItem[0].Flags = P_Flags;\
  7428.         FramingExPointer->FramingItem[0].Frames = P_Frames;\
  7429.         FramingExPointer->FramingItem[0].FileAlignment = P_Alignment;\
  7430.         FramingExPointer->FramingItem[0].MemoryTypeWeight = 0;\
  7431.         SetDontCareKsFramingRange(KsFramingRange);\
  7432.         SetKsFramingRangeWeighted(KsFramingRangeWeighted, P_MinFrameSize, P_MaxFrameSize);\
  7433.     }
  7434.  
  7435.  
  7436.  
  7437.     // KSEVENTSETID_StreamAllocator: {75D95571-073C-11d0-A161-0020AFD156E4}
  7438.  
  7439.     #define STATIC_KSEVENTSETID_StreamAllocator\
  7440.         0x75d95571L, 0x073c, 0x11d0, 0xa1, 0x61, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
  7441.     DEFINE_GUIDSTRUCT("75d95571-073c-11d0-a161-0020afd156e4", KSEVENTSETID_StreamAllocator);
  7442.     #define KSEVENTSETID_StreamAllocator DEFINE_GUIDNAMED(KSEVENTSETID_StreamAllocator)
  7443.  
  7444.     typedef enum {
  7445.         KSEVENT_STREAMALLOCATOR_INTERNAL_FREEFRAME,
  7446.         KSEVENT_STREAMALLOCATOR_FREEFRAME
  7447.     } KSEVENT_STREAMALLOCATOR;
  7448.  
  7449.     #define STATIC_KSMETHODSETID_StreamAllocator\
  7450.         0xcf6e4341L, 0xec87, 0x11cf, 0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
  7451.     DEFINE_GUIDSTRUCT("cf6e4341-ec87-11cf-a130-0020afd156e4", KSMETHODSETID_StreamAllocator);
  7452.     #define KSMETHODSETID_StreamAllocator DEFINE_GUIDNAMED(KSMETHODSETID_StreamAllocator)
  7453.  
  7454.     typedef enum {
  7455.         KSMETHOD_STREAMALLOCATOR_ALLOC,
  7456.         KSMETHOD_STREAMALLOCATOR_FREE
  7457.     } KSMETHOD_STREAMALLOCATOR;
  7458.  
  7459.     #define DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_ALLOC(Handler)\
  7460.         DEFINE_KSMETHOD_ITEM(\
  7461.             KSMETHOD_STREAMALLOCATOR_ALLOC,\
  7462.             KSMETHOD_TYPE_WRITE,\
  7463.             (Handler),\
  7464.             sizeof(KSMETHOD),\
  7465.             sizeof(PVOID),\
  7466.             NULL)
  7467.  
  7468.     #define DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_FREE(Handler)\
  7469.         DEFINE_KSMETHOD_ITEM(\
  7470.             KSMETHOD_STREAMALLOCATOR_FREE,\
  7471.             KSMETHOD_TYPE_READ,\
  7472.             (Handler),\
  7473.             sizeof(KSMETHOD),\
  7474.             sizeof(PVOID),\
  7475.             NULL)
  7476.  
  7477.     #define DEFINE_KSMETHOD_ALLOCATORSET(AllocatorSet, MethodAlloc, MethodFree)\
  7478.     DEFINE_KSMETHOD_TABLE(AllocatorSet) {\
  7479.         DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_ALLOC(MethodAlloc),\
  7480.         DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_FREE(MethodFree)\
  7481.     }
  7482.  
  7483.     #define STATIC_KSPROPSETID_StreamAllocator\
  7484.         0xcf6e4342L, 0xec87, 0x11cf, 0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
  7485.     DEFINE_GUIDSTRUCT("cf6e4342-ec87-11cf-a130-0020afd156e4", KSPROPSETID_StreamAllocator);
  7486.     #define KSPROPSETID_StreamAllocator DEFINE_GUIDNAMED(KSPROPSETID_StreamAllocator)
  7487.  
  7488.     #if defined(_NTDDK_)
  7489.     typedef enum {
  7490.         KSPROPERTY_STREAMALLOCATOR_FUNCTIONTABLE,
  7491.         KSPROPERTY_STREAMALLOCATOR_STATUS
  7492.     } KSPROPERTY_STREAMALLOCATOR;
  7493.  
  7494.     #define DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_FUNCTIONTABLE(Handler)\
  7495.         DEFINE_KSPROPERTY_ITEM(\
  7496.             KSPROPERTY_STREAMALLOCATOR_FUNCTIONTABLE,\
  7497.             (Handler),\
  7498.             sizeof(KSPROPERTY),\
  7499.             sizeof(KSSTREAMALLOCATOR_FUNCTIONTABLE),\
  7500.             NULL, NULL, 0, NULL, NULL, 0)
  7501.         
  7502.     #define DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_STATUS(Handler)\
  7503.         DEFINE_KSPROPERTY_ITEM(\
  7504.             KSPROPERTY_STREAMALLOCATOR_STATUS,\
  7505.             (Handler),\
  7506.             sizeof(KSPROPERTY),\
  7507.             sizeof(KSSTREAMALLOCATOR_STATUS),\
  7508.             NULL, NULL, 0, NULL, NULL, 0)
  7509.  
  7510.     #define DEFINE_KSPROPERTY_ALLOCATORSET(AllocatorSet, PropFunctionTable, PropStatus)\
  7511.     DEFINE_KSPROPERTY_TABLE(AllocatorSet) {\
  7512.         DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_STATUS(PropStatus),\
  7513.         DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_FUNCTIONTABLE(PropFunctionTable)\
  7514.     }
  7515.  
  7516.     typedef
  7517.     NTSTATUS
  7518.     (*PFNALLOCATOR_ALLOCATEFRAME)(
  7519.         IN PFILE_OBJECT FileObject,
  7520.         PVOID *Frame
  7521.         );
  7522.  
  7523.     typedef
  7524.     VOID
  7525.     (*PFNALLOCATOR_FREEFRAME)(
  7526.         IN PFILE_OBJECT FileObject,
  7527.         IN PVOID Frame
  7528.         );
  7529.  
  7530.     typedef struct {
  7531.         PFNALLOCATOR_ALLOCATEFRAME  AllocateFrame;
  7532.         PFNALLOCATOR_FREEFRAME      FreeFrame;
  7533.     } KSSTREAMALLOCATOR_FUNCTIONTABLE, *PKSSTREAMALLOCATOR_FUNCTIONTABLE;
  7534.     #endif // defined(_NTDDK_)
  7535.  
  7536.     typedef struct {
  7537.         KSALLOCATOR_FRAMING Framing;
  7538.         ULONG               AllocatedFrames;
  7539.         ULONG               Reserved;
  7540.     } KSSTREAMALLOCATOR_STATUS, *PKSSTREAMALLOCATOR_STATUS;
  7541.  
  7542.     typedef struct {
  7543.         KSALLOCATOR_FRAMING_EX Framing;
  7544.         ULONG                  AllocatedFrames;
  7545.         ULONG                  Reserved;
  7546.     } KSSTREAMALLOCATOR_STATUS_EX, *PKSSTREAMALLOCATOR_STATUS_EX;
  7547.  
  7548.  
  7549.     #define KSSTREAM_HEADER_OPTIONSF_SPLICEPOINT        0x00000001
  7550.     #define KSSTREAM_HEADER_OPTIONSF_PREROLL            0x00000002
  7551.     #define KSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY  0x00000004
  7552.     #define KSSTREAM_HEADER_OPTIONSF_TYPECHANGED        0x00000008
  7553.     #define KSSTREAM_HEADER_OPTIONSF_TIMEVALID          0x00000010
  7554.     #define KSSTREAM_HEADER_OPTIONSF_TIMEDISCONTINUITY  0x00000040
  7555.     #define KSSTREAM_HEADER_OPTIONSF_FLUSHONPAUSE       0x00000080
  7556.     #define KSSTREAM_HEADER_OPTIONSF_DURATIONVALID      0x00000100
  7557.     #define KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM        0x00000200
  7558.     #define KSSTREAM_HEADER_OPTIONSF_LOOPEDDATA         0x80000000
  7559.  
  7560.     typedef struct {
  7561.         LONGLONG    Time;
  7562.         ULONG       Numerator;
  7563.         ULONG       Denominator;
  7564.     } KSTIME, *PKSTIME;
  7565.  
  7566.     typedef struct {
  7567.         ULONG       Size;
  7568.         ULONG       TypeSpecificFlags;
  7569.         KSTIME      PresentationTime;
  7570.         LONGLONG    Duration;
  7571.         ULONG       FrameExtent;
  7572.         ULONG       DataUsed;
  7573.         PVOID       Data;
  7574.         ULONG       OptionsFlags;
  7575.     #if _WIN64
  7576.         ULONG       Reserved;
  7577.     #endif
  7578.     } KSSTREAM_HEADER, *PKSSTREAM_HEADER;
  7579.  
  7580.     #define STATIC_KSPROPSETID_StreamInterface\
  7581.         0x1fdd8ee1L, 0x9cd3, 0x11d0, 0x82, 0xaa, 0x00, 0x00, 0xf8, 0x22, 0xfe, 0x8a
  7582.     DEFINE_GUIDSTRUCT("1fdd8ee1-9cd3-11d0-82aa-0000f822fe8a", KSPROPSETID_StreamInterface);
  7583.     #define KSPROPSETID_StreamInterface DEFINE_GUIDNAMED(KSPROPSETID_StreamInterface)
  7584.  
  7585.     typedef enum {
  7586.         KSPROPERTY_STREAMINTERFACE_HEADERSIZE
  7587.     } KSPROPERTY_STREAMINTERFACE;
  7588.  
  7589.     #define DEFINE_KSPROPERTY_ITEM_STREAMINTERFACE_HEADERSIZE( GetHandler )\
  7590.         DEFINE_KSPROPERTY_ITEM(\
  7591.             KSPROPERTY_STREAMINTERFACE_HEADERSIZE,\
  7592.             (GetHandler),\
  7593.             sizeof(KSPROPERTY),\
  7594.             sizeof(ULONG),\
  7595.             NULL, NULL, 0, NULL, NULL, 0)
  7596.         
  7597.     #define DEFINE_KSPROPERTY_STREAMINTERFACESET(StreamInterfaceSet,\
  7598.         HeaderSizeHandler)\
  7599.     DEFINE_KSPROPERTY_TABLE(StreamInterfaceSet) {\
  7600.         DEFINE_KSPROPERTY_ITEM_STREAMINTERFACE_HEADERSIZE( HeaderSizeHandler )\
  7601.     }
  7602.  
  7603.     #define STATIC_KSPROPSETID_Stream\
  7604.         0x65aaba60L, 0x98ae, 0x11cf, 0xa1, 0x0d, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
  7605.     DEFINE_GUIDSTRUCT("65aaba60-98ae-11cf-a10d-0020afd156e4", KSPROPSETID_Stream);
  7606.     #define KSPROPSETID_Stream DEFINE_GUIDNAMED(KSPROPSETID_Stream)
  7607.  
  7608.     typedef enum {
  7609.         KSPROPERTY_STREAM_ALLOCATOR,
  7610.         KSPROPERTY_STREAM_QUALITY,
  7611.         KSPROPERTY_STREAM_DEGRADATION,
  7612.         KSPROPERTY_STREAM_MASTERCLOCK,
  7613.         KSPROPERTY_STREAM_TIMEFORMAT,
  7614.         KSPROPERTY_STREAM_PRESENTATIONTIME,
  7615.         KSPROPERTY_STREAM_PRESENTATIONEXTENT,
  7616.         KSPROPERTY_STREAM_FRAMETIME,
  7617.         KSPROPERTY_STREAM_RATECAPABILITY,
  7618.         KSPROPERTY_STREAM_RATE,
  7619.         KSPROPERTY_STREAM_PIPE_ID
  7620.     } KSPROPERTY_STREAM;
  7621.  
  7622.     #define DEFINE_KSPROPERTY_ITEM_STREAM_ALLOCATOR(GetHandler, SetHandler)\
  7623.         DEFINE_KSPROPERTY_ITEM(\
  7624.             KSPROPERTY_STREAM_ALLOCATOR,\
  7625.             (GetHandler),\
  7626.             sizeof(KSPROPERTY),\
  7627.             sizeof(HANDLE),\
  7628.             (SetHandler),\
  7629.             NULL, 0, NULL, NULL, 0)
  7630.  
  7631.     #define DEFINE_KSPROPERTY_ITEM_STREAM_QUALITY(Handler)\
  7632.         DEFINE_KSPROPERTY_ITEM(\
  7633.             KSPROPERTY_STREAM_QUALITY,\
  7634.             (Handler),\
  7635.             sizeof(KSPROPERTY),\
  7636.             sizeof(KSQUALITY_MANAGER),\
  7637.             NULL, NULL, 0, NULL, NULL, 0)
  7638.  
  7639.     #define DEFINE_KSPROPERTY_ITEM_STREAM_DEGRADATION(GetHandler, SetHandler)\
  7640.         DEFINE_KSPROPERTY_ITEM(\
  7641.             KSPROPERTY_STREAM_DEGRADATION,\
  7642.             (GetHandler),\
  7643.             sizeof(KSPROPERTY),\
  7644.             0,\
  7645.             (SetHandler),\
  7646.             NULL, 0, NULL, NULL, 0)
  7647.  
  7648.     #define DEFINE_KSPROPERTY_ITEM_STREAM_MASTERCLOCK(GetHandler, SetHandler)\
  7649.         DEFINE_KSPROPERTY_ITEM(\
  7650.             KSPROPERTY_STREAM_MASTERCLOCK,\
  7651.             (GetHandler),\
  7652.             sizeof(KSPROPERTY),\
  7653.             sizeof(HANDLE),\
  7654.             (SetHandler),\
  7655.             NULL, 0, NULL, NULL, 0)
  7656.  
  7657.     #define DEFINE_KSPROPERTY_ITEM_STREAM_TIMEFORMAT(Handler)\
  7658.         DEFINE_KSPROPERTY_ITEM(\
  7659.             KSPROPERTY_STREAM_TIMEFORMAT,\
  7660.             (Handler),\
  7661.             sizeof(KSPROPERTY),\
  7662.             sizeof(GUID),\
  7663.             NULL, NULL, 0, NULL, NULL, 0)
  7664.  
  7665.     #define DEFINE_KSPROPERTY_ITEM_STREAM_PRESENTATIONTIME(GetHandler, SetHandler)\
  7666.         DEFINE_KSPROPERTY_ITEM(\
  7667.             KSPROPERTY_STREAM_PRESENTATIONTIME,\
  7668.             (GetHandler),\
  7669.             sizeof(KSPROPERTY),\
  7670.             sizeof(KSTIME),\
  7671.             (SetHandler),\
  7672.             NULL, 0, NULL, NULL, 0)
  7673.  
  7674.     #define DEFINE_KSPROPERTY_ITEM_STREAM_PRESENTATIONEXTENT(Handler)\
  7675.         DEFINE_KSPROPERTY_ITEM(\
  7676.             KSPROPERTY_STREAM_PRESENTATIONEXTENT,\
  7677.             (Handler),\
  7678.             sizeof(KSPROPERTY),\
  7679.             sizeof(LONGLONG),\
  7680.             NULL, NULL, 0, NULL, NULL, 0)
  7681.  
  7682.     #define DEFINE_KSPROPERTY_ITEM_STREAM_FRAMETIME(Handler)\
  7683.         DEFINE_KSPROPERTY_ITEM(\
  7684.             KSPROPERTY_STREAM_FRAMETIME,\
  7685.             (Handler),\
  7686.             sizeof(KSPROPERTY),\
  7687.             sizeof(KSFRAMETIME),\
  7688.             NULL, NULL, 0, NULL, NULL, 0)
  7689.  
  7690.     #define DEFINE_KSPROPERTY_ITEM_STREAM_RATECAPABILITY(Handler)\
  7691.         DEFINE_KSPROPERTY_ITEM(\
  7692.             KSPROPERTY_STREAM_RATECAPABILITY,\
  7693.             (Handler),\
  7694.             sizeof(KSRATE_CAPABILITY),\
  7695.             sizeof(KSRATE),\
  7696.             NULL, NULL, 0, NULL, NULL, 0)
  7697.  
  7698.     #define DEFINE_KSPROPERTY_ITEM_STREAM_RATE(GetHandler, SetHandler)\
  7699.         DEFINE_KSPROPERTY_ITEM(\
  7700.             KSPROPERTY_STREAM_RATE,\
  7701.             (GetHandler),\
  7702.             sizeof(KSPROPERTY),\
  7703.             sizeof(KSRATE),\
  7704.             (SetHandler),\
  7705.             NULL, 0, NULL, NULL, 0)
  7706.  
  7707.     #define DEFINE_KSPROPERTY_ITEM_STREAM_PIPE_ID(GetHandler, SetHandler)\
  7708.         DEFINE_KSPROPERTY_ITEM(\
  7709.             KSPROPERTY_STREAM_PIPE_ID,\
  7710.             (GetHandler),\
  7711.             sizeof(KSPROPERTY),\
  7712.             sizeof(HANDLE),\
  7713.             (SetHandler),\
  7714.             NULL, 0, NULL, NULL, 0)
  7715.  
  7716.     typedef struct {
  7717.         HANDLE      QualityManager;
  7718.         PVOID       Context;
  7719.     } KSQUALITY_MANAGER, *PKSQUALITY_MANAGER;
  7720.  
  7721.     typedef struct {
  7722.         LONGLONG    Duration;
  7723.         ULONG       FrameFlags;
  7724.         ULONG       Reserved;
  7725.     } KSFRAMETIME, *PKSFRAMETIME;
  7726.  
  7727.     #define KSFRAMETIME_VARIABLESIZE    0x00000001
  7728.  
  7729.     typedef struct {
  7730.         LONGLONG        PresentationStart;
  7731.         LONGLONG        Duration;
  7732.         KSPIN_INTERFACE Interface;
  7733.         LONG            Rate;
  7734.         ULONG           Flags;
  7735.     } KSRATE, *PKSRATE;
  7736.  
  7737.     #define KSRATE_NOPRESENTATIONSTART      0x00000001
  7738.     #define KSRATE_NOPRESENTATIONDURATION   0x00000002
  7739.  
  7740.     typedef struct {
  7741.         KSPROPERTY      Property;
  7742.         KSRATE          Rate;
  7743.     } KSRATE_CAPABILITY, *PKSRATE_CAPABILITY;
  7744.  
  7745.     #define STATIC_KSPROPSETID_Clock \
  7746.         0xDF12A4C0L, 0xAC17, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  7747.     DEFINE_GUIDSTRUCT("DF12A4C0-AC17-11CF-A5D6-28DB04C10000", KSPROPSETID_Clock);
  7748.     #define KSPROPSETID_Clock DEFINE_GUIDNAMED(KSPROPSETID_Clock)
  7749.  
  7750.     //
  7751.     // Performs a x*y/z operation on 64 bit quantities by splitting the operation. The equation
  7752.     // is simplified with respect to adding in the remainder for the upper 32 bits.
  7753.     //
  7754.     // (xh * 10000000 / Frequency) * 2^32 + ((((xh * 10000000) % Frequency) * 2^32 + (xl * 10000000)) / Frequency)
  7755.     //
  7756.     #define NANOSECONDS 10000000
  7757.     #define KSCONVERT_PERFORMANCE_TIME(Frequency, PerformanceTime) \
  7758.         ((((ULONGLONG)(ULONG)(PerformanceTime).HighPart * NANOSECONDS / (Frequency)) << 32) + \
  7759.         ((((((ULONGLONG)(ULONG)(PerformanceTime).HighPart * NANOSECONDS) % (Frequency)) << 32) + \
  7760.         ((ULONGLONG)(PerformanceTime).LowPart * NANOSECONDS)) / (Frequency)))
  7761.  
  7762.     typedef struct {
  7763.         ULONG       CreateFlags;
  7764.     } KSCLOCK_CREATE, *PKSCLOCK_CREATE;
  7765.  
  7766.     typedef struct {
  7767.         LONGLONG    Time;
  7768.         LONGLONG    SystemTime;
  7769.     } KSCORRELATED_TIME, *PKSCORRELATED_TIME;
  7770.  
  7771.     typedef struct {
  7772.         LONGLONG    Granularity;
  7773.         LONGLONG    Error;
  7774.     } KSRESOLUTION, *PKSRESOLUTION;
  7775.  
  7776.     typedef enum {
  7777.         KSPROPERTY_CLOCK_TIME,
  7778.         KSPROPERTY_CLOCK_PHYSICALTIME,
  7779.         KSPROPERTY_CLOCK_CORRELATEDTIME,
  7780.         KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME,
  7781.         KSPROPERTY_CLOCK_RESOLUTION,
  7782.         KSPROPERTY_CLOCK_STATE,
  7783.     #if defined(_NTDDK_)
  7784.         KSPROPERTY_CLOCK_FUNCTIONTABLE
  7785.     #endif // defined(_NTDDK_)
  7786.     } KSPROPERTY_CLOCK;
  7787.  
  7788.     #if defined(_NTDDK_)
  7789.  
  7790.     typedef
  7791.     LONGLONG
  7792.     (FASTCALL *PFNKSCLOCK_GETTIME)(
  7793.         IN PFILE_OBJECT FileObject
  7794.         );
  7795.     typedef
  7796.     LONGLONG
  7797.     (FASTCALL *PFNKSCLOCK_CORRELATEDTIME)(
  7798.         IN PFILE_OBJECT FileObject,
  7799.         OUT PLONGLONG SystemTime);
  7800.  
  7801.     typedef struct {
  7802.         PFNKSCLOCK_GETTIME GetTime;
  7803.         PFNKSCLOCK_GETTIME GetPhysicalTime;
  7804.         PFNKSCLOCK_CORRELATEDTIME GetCorrelatedTime;
  7805.         PFNKSCLOCK_CORRELATEDTIME GetCorrelatedPhysicalTime;
  7806.     } KSCLOCK_FUNCTIONTABLE, *PKSCLOCK_FUNCTIONTABLE;
  7807.  
  7808.     typedef
  7809.     BOOLEAN
  7810.     (*PFNKSSETTIMER)(
  7811.         IN PVOID Context,
  7812.         IN PKTIMER Timer,
  7813.         IN LARGE_INTEGER DueTime,
  7814.         IN PKDPC Dpc
  7815.         );
  7816.  
  7817.     typedef
  7818.     BOOLEAN
  7819.     (*PFNKSCANCELTIMER)(
  7820.         IN PVOID Context,
  7821.         IN PKTIMER Timer
  7822.         );
  7823.  
  7824.     typedef
  7825.     LONGLONG
  7826.     (FASTCALL *PFNKSCORRELATEDTIME)(
  7827.         IN PVOID Context,
  7828.         OUT PLONGLONG SystemTime);
  7829.  
  7830.     typedef PVOID   PKSDEFAULTCLOCK;
  7831.  
  7832.     #define DEFINE_KSPROPERTY_ITEM_CLOCK_TIME(Handler)\
  7833.         DEFINE_KSPROPERTY_ITEM(\
  7834.             KSPROPERTY_CLOCK_TIME,\
  7835.             (Handler),\
  7836.             sizeof(KSPROPERTY),\
  7837.             sizeof(LONGLONG),\
  7838.             NULL, NULL, 0, NULL, NULL, 0)
  7839.  
  7840.     #define DEFINE_KSPROPERTY_ITEM_CLOCK_PHYSICALTIME(Handler)\
  7841.         DEFINE_KSPROPERTY_ITEM(\
  7842.             KSPROPERTY_CLOCK_PHYSICALTIME,\
  7843.             (Handler),\
  7844.             sizeof(KSPROPERTY),\
  7845.             sizeof(LONGLONG),\
  7846.             NULL, NULL, 0, NULL, NULL, 0)
  7847.  
  7848.     #define DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDTIME(Handler)\
  7849.         DEFINE_KSPROPERTY_ITEM(\
  7850.             KSPROPERTY_CLOCK_CORRELATEDTIME,\
  7851.             (Handler),\
  7852.             sizeof(KSPROPERTY),\
  7853.             sizeof(KSCORRELATED_TIME),\
  7854.             NULL, NULL, 0, NULL, NULL, 0)
  7855.  
  7856.     #define DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDPHYSICALTIME(Handler)\
  7857.         DEFINE_KSPROPERTY_ITEM(\
  7858.             KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME,\
  7859.             (Handler),\
  7860.             sizeof(KSPROPERTY),\
  7861.             sizeof(KSCORRELATED_TIME),\
  7862.             NULL, NULL, 0, NULL, NULL, 0)
  7863.  
  7864.     #define DEFINE_KSPROPERTY_ITEM_CLOCK_RESOLUTION(Handler)\
  7865.         DEFINE_KSPROPERTY_ITEM(\
  7866.             KSPROPERTY_CLOCK_RESOLUTION,\
  7867.             (Handler),\
  7868.             sizeof(KSPROPERTY),\
  7869.             sizeof(KSRESOLUTION),\
  7870.             NULL, NULL, 0, NULL, NULL, 0)
  7871.  
  7872.     #define DEFINE_KSPROPERTY_ITEM_CLOCK_STATE(Handler)\
  7873.         DEFINE_KSPROPERTY_ITEM(\
  7874.             KSPROPERTY_CLOCK_STATE,\
  7875.             (Handler),\
  7876.             sizeof(KSPROPERTY),\
  7877.             sizeof(KSSTATE),\
  7878.             NULL, NULL, 0, NULL, NULL, 0)
  7879.  
  7880.     #define DEFINE_KSPROPERTY_ITEM_CLOCK_FUNCTIONTABLE(Handler)\
  7881.         DEFINE_KSPROPERTY_ITEM(\
  7882.             KSPROPERTY_CLOCK_FUNCTIONTABLE,\
  7883.             (Handler),\
  7884.             sizeof(KSPROPERTY),\
  7885.             sizeof(KSCLOCK_FUNCTIONTABLE),\
  7886.             NULL, NULL, 0, NULL, NULL, 0)
  7887.  
  7888.     #define DEFINE_KSPROPERTY_CLOCKSET(ClockSet,\
  7889.         PropTime, PropPhysicalTime,\
  7890.         PropCorrelatedTime, PropCorrelatedPhysicalTime,\
  7891.         PropResolution, PropState, PropFunctionTable)\
  7892.     DEFINE_KSPROPERTY_TABLE(ClockSet) {\
  7893.         DEFINE_KSPROPERTY_ITEM_CLOCK_TIME(PropTime),\
  7894.         DEFINE_KSPROPERTY_ITEM_CLOCK_PHYSICALTIME(PropPhysicalTime),\
  7895.         DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDTIME(PropCorrelatedTime),\
  7896.         DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDPHYSICALTIME(PropCorrelatedPhysicalTime),\
  7897.         DEFINE_KSPROPERTY_ITEM_CLOCK_RESOLUTION(PropResolution),\
  7898.         DEFINE_KSPROPERTY_ITEM_CLOCK_STATE(PropState),\
  7899.         DEFINE_KSPROPERTY_ITEM_CLOCK_FUNCTIONTABLE(PropFunctionTable),\
  7900.     }
  7901.  
  7902.     #endif // defined(_NTDDK_)
  7903.  
  7904.     #define STATIC_KSEVENTSETID_Clock \
  7905.         0x364D8E20L, 0x62C7, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  7906.     DEFINE_GUIDSTRUCT("364D8E20-62C7-11CF-A5D6-28DB04C10000", KSEVENTSETID_Clock);
  7907.     #define KSEVENTSETID_Clock DEFINE_GUIDNAMED(KSEVENTSETID_Clock)
  7908.  
  7909.     typedef enum {
  7910.         KSEVENT_CLOCK_INTERVAL_MARK,
  7911.         KSEVENT_CLOCK_POSITION_MARK
  7912.     } KSEVENT_CLOCK_POSITION;
  7913.  
  7914.     #define STATIC_KSEVENTSETID_Connection\
  7915.         0x7f4bcbe0L, 0x9ea5, 0x11cf, 0xa5, 0xd6, 0x28, 0xdb, 0x04, 0xc1, 0x00, 0x00
  7916.     DEFINE_GUIDSTRUCT("7f4bcbe0-9ea5-11cf-a5d6-28db04c10000", KSEVENTSETID_Connection);
  7917.     #define KSEVENTSETID_Connection DEFINE_GUIDNAMED(KSEVENTSETID_Connection)
  7918.  
  7919.     typedef enum {
  7920.         KSEVENT_CONNECTION_POSITIONUPDATE,
  7921.         KSEVENT_CONNECTION_DATADISCONTINUITY,
  7922.         KSEVENT_CONNECTION_TIMEDISCONTINUITY,
  7923.         KSEVENT_CONNECTION_PRIORITY,
  7924.         KSEVENT_CONNECTION_ENDOFSTREAM
  7925.     } KSEVENT_CONNECTION;
  7926.  
  7927.     typedef struct {
  7928.         PVOID       Context;
  7929.         ULONG       Proportion;
  7930.         LONGLONG    DeltaTime;
  7931.     } KSQUALITY, *PKSQUALITY;
  7932.  
  7933.     typedef struct {
  7934.         PVOID       Context;
  7935.         ULONG       Status;
  7936.     } KSERROR, *PKSERROR;
  7937.  
  7938.     typedef KSIDENTIFIER KSDEGRADE, *PKSDEGRADE;
  7939.  
  7940.     #define STATIC_KSDEGRADESETID_Standard\
  7941.         0x9F564180L, 0x704C, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  7942.     DEFINE_GUIDSTRUCT("9F564180-704C-11D0-A5D6-28DB04C10000", KSDEGRADESETID_Standard);
  7943.     #define KSDEGRADESETID_Standard DEFINE_GUIDNAMED(KSDEGRADESETID_Standard)
  7944.  
  7945.     typedef enum {
  7946.         KSDEGRADE_STANDARD_SAMPLE,
  7947.         KSDEGRADE_STANDARD_QUALITY,
  7948.         KSDEGRADE_STANDARD_COMPUTATION,
  7949.         KSDEGRADE_STANDARD_SKIP
  7950.     } KSDEGRADE_STANDARD;
  7951.  
  7952.     #if defined(_NTDDK_)
  7953.  
  7954.     #define KSPROBE_STREAMREAD      0x00000000
  7955.     #define KSPROBE_STREAMWRITE     0x00000001
  7956.     #define KSPROBE_ALLOCATEMDL     0x00000010
  7957.     #define KSPROBE_PROBEANDLOCK    0x00000020
  7958.     #define KSPROBE_SYSTEMADDRESS   0x00000040
  7959.     #define KSPROBE_MODIFY          0x00000200
  7960.     #define KSPROBE_STREAMWRITEMODIFY (KSPROBE_MODIFY | KSPROBE_STREAMWRITE)
  7961.     #define KSPROBE_ALLOWFORMATCHANGE   0x00000080
  7962.  
  7963.     #define KSSTREAM_READ           KSPROBE_STREAMREAD
  7964.     #define KSSTREAM_WRITE          KSPROBE_STREAMWRITE
  7965.     #define KSSTREAM_PAGED_DATA     0x00000000
  7966.     #define KSSTREAM_NONPAGED_DATA  0x00000100
  7967.     #define KSSTREAM_SYNCHRONOUS    0x00001000
  7968.     #define KSSTREAM_FAILUREEXCEPTION 0x00002000
  7969.  
  7970.     typedef
  7971.     NTSTATUS
  7972.     (*PFNKSCONTEXT_DISPATCH)(
  7973.         IN PVOID Context,
  7974.         IN PIRP Irp
  7975.         );
  7976.  
  7977.     typedef
  7978.     NTSTATUS
  7979.     (*PFNKSHANDLER)(
  7980.         IN PIRP Irp,
  7981.         IN PKSIDENTIFIER Request,
  7982.         IN OUT PVOID Data
  7983.         );
  7984.  
  7985.     typedef
  7986.     BOOLEAN
  7987.     (*PFNKSFASTHANDLER)(
  7988.         IN PFILE_OBJECT FileObject,
  7989.         IN PKSIDENTIFIER UNALIGNED Request,
  7990.         IN ULONG RequestLength,
  7991.         IN OUT PVOID UNALIGNED Data,
  7992.         IN ULONG DataLength,
  7993.         OUT PIO_STATUS_BLOCK IoStatus
  7994.         );
  7995.  
  7996.     typedef
  7997.     NTSTATUS
  7998.     (*PFNKSALLOCATOR)(
  7999.         IN PIRP Irp,
  8000.         IN ULONG BufferSize,
  8001.         IN BOOLEAN InputOperation
  8002.         );
  8003.  
  8004.     typedef struct {
  8005.         KSPROPERTY_MEMBERSHEADER    MembersHeader;
  8006.         const VOID*                 Members;
  8007.     } KSPROPERTY_MEMBERSLIST, *PKSPROPERTY_MEMBERSLIST;
  8008.  
  8009.     typedef struct {
  8010.         KSIDENTIFIER                    PropTypeSet;
  8011.         ULONG                           MembersListCount;
  8012.         const KSPROPERTY_MEMBERSLIST*   MembersList;
  8013.     } KSPROPERTY_VALUES, *PKSPROPERTY_VALUES;
  8014.  
  8015.     #define DEFINE_KSPROPERTY_TABLE(tablename)\
  8016.         const KSPROPERTY_ITEM tablename[] =
  8017.  
  8018.     #define DEFINE_KSPROPERTY_ITEM(PropertyId, GetHandler,\
  8019.                                    MinProperty,\
  8020.                                    MinData,\
  8021.                                    SetHandler,\
  8022.                                    Values, RelationsCount, Relations, SupportHandler,\
  8023.                                    SerializedSize)\
  8024.     {\
  8025.         PropertyId, (PFNKSHANDLER)GetHandler, MinProperty, MinData,\
  8026.         (PFNKSHANDLER)SetHandler,\
  8027.         (PKSPROPERTY_VALUES)Values, RelationsCount, (PKSPROPERTY)Relations,\
  8028.         (PFNKSHANDLER)SupportHandler, (ULONG)SerializedSize\
  8029.     }
  8030.  
  8031.     typedef struct {
  8032.         ULONG                   PropertyId;
  8033.         union {
  8034.             PFNKSHANDLER            GetPropertyHandler;
  8035.             BOOLEAN                 GetSupported;
  8036.         };
  8037.         ULONG                   MinProperty;
  8038.         ULONG                   MinData;
  8039.         union {
  8040.             PFNKSHANDLER            SetPropertyHandler;
  8041.             BOOLEAN                 SetSupported;
  8042.         };
  8043.         const KSPROPERTY_VALUES*Values;
  8044.         ULONG                   RelationsCount;
  8045.         const KSPROPERTY*       Relations;
  8046.         PFNKSHANDLER            SupportHandler;
  8047.         ULONG                   SerializedSize;
  8048.     } KSPROPERTY_ITEM, *PKSPROPERTY_ITEM;
  8049.  
  8050.     #define DEFINE_KSFASTPROPERTY_ITEM(PropertyId, GetHandler, SetHandler)\
  8051.     {\
  8052.         PropertyId, (PFNKSFASTHANDLER)GetHandler, (PFNKSFASTHANDLER)SetHandler, 0\
  8053.     }
  8054.  
  8055.     typedef struct {
  8056.         ULONG                       PropertyId;
  8057.         union {
  8058.             PFNKSFASTHANDLER            GetPropertyHandler;
  8059.             BOOLEAN                     GetSupported;
  8060.         };
  8061.         union {
  8062.             PFNKSFASTHANDLER            SetPropertyHandler;
  8063.             BOOLEAN                     SetSupported;
  8064.         };
  8065.         ULONG                       Reserved;
  8066.     } KSFASTPROPERTY_ITEM, *PKSFASTPROPERTY_ITEM;
  8067.  
  8068.     #define DEFINE_KSPROPERTY_SET(Set,\
  8069.                                   PropertiesCount,\
  8070.                                   PropertyItem,\
  8071.                                   FastIoCount,\
  8072.                                   FastIoTable)\
  8073.     {\
  8074.         Set,\
  8075.         PropertiesCount,\
  8076.         PropertyItem,\
  8077.         FastIoCount,\
  8078.         FastIoTable\
  8079.     }
  8080.  
  8081.     #define DEFINE_KSPROPERTY_SET_TABLE(tablename)\
  8082.         const KSPROPERTY_SET tablename[] =
  8083.  
  8084.     typedef struct {
  8085.         const GUID*                 Set;
  8086.         ULONG                       PropertiesCount;
  8087.         const KSPROPERTY_ITEM*      PropertyItem;
  8088.         ULONG                       FastIoCount;
  8089.         const KSFASTPROPERTY_ITEM*  FastIoTable;
  8090.     } KSPROPERTY_SET, *PKSPROPERTY_SET;
  8091.  
  8092.     #define DEFINE_KSMETHOD_TABLE(tablename)\
  8093.         const KSMETHOD_ITEM tablename[] =
  8094.  
  8095.     #define DEFINE_KSMETHOD_ITEM(MethodId, Flags,\
  8096.                                  MethodHandler,\
  8097.                                  MinMethod, MinData, SupportHandler)\
  8098.     {\
  8099.         MethodId, (PFNKSHANDLER)MethodHandler, MinMethod, MinData,\
  8100.         SupportHandler, Flags\
  8101.     }
  8102.  
  8103.     typedef struct {
  8104.         ULONG                   MethodId;
  8105.         union {
  8106.             PFNKSHANDLER            MethodHandler;
  8107.             BOOLEAN                 MethodSupported;
  8108.         };
  8109.         ULONG                   MinMethod;
  8110.         ULONG                   MinData;
  8111.         PFNKSHANDLER            SupportHandler;
  8112.         ULONG                   Flags;
  8113.     } KSMETHOD_ITEM, *PKSMETHOD_ITEM;
  8114.  
  8115.     #define DEFINE_KSFASTMETHOD_ITEM(MethodId, MethodHandler)\
  8116.     {\
  8117.         MethodId, (PFNKSFASTHANDLER)MethodHandler\
  8118.     }
  8119.  
  8120.     typedef struct {
  8121.         ULONG                   MethodId;
  8122.         union {
  8123.             PFNKSFASTHANDLER        MethodHandler;
  8124.             BOOLEAN                 MethodSupported;
  8125.         };
  8126.     } KSFASTMETHOD_ITEM, *PKSFASTMETHOD_ITEM;
  8127.  
  8128.     #define DEFINE_KSMETHOD_SET(Set,\
  8129.                                 MethodsCount,\
  8130.                                 MethodItem,\
  8131.                                 FastIoCount,\
  8132.                                 FastIoTable)\
  8133.     {\
  8134.         Set,\
  8135.         MethodsCount,\
  8136.         MethodItem,\
  8137.         FastIoCount,\
  8138.         FastIoTable\
  8139.     }
  8140.  
  8141.     #define DEFINE_KSMETHOD_SET_TABLE(tablename)\
  8142.         const KSMETHOD_SET tablename[] =
  8143.  
  8144.     typedef struct {
  8145.         const GUID*             Set;
  8146.         ULONG                   MethodsCount;
  8147.         const KSMETHOD_ITEM*    MethodItem;
  8148.         ULONG                   FastIoCount;
  8149.         const KSFASTMETHOD_ITEM*FastIoTable;
  8150.     } KSMETHOD_SET, *PKSMETHOD_SET;
  8151.  
  8152.     typedef struct _KSEVENT_ENTRY
  8153.     KSEVENT_ENTRY, *PKSEVENT_ENTRY;
  8154.  
  8155.     typedef
  8156.     NTSTATUS
  8157.     (*PFNKSADDEVENT)(
  8158.         IN PIRP Irp,
  8159.         IN PKSEVENTDATA EventData,
  8160.         IN struct _KSEVENT_ENTRY* EventEntry
  8161.         );
  8162.  
  8163.     typedef
  8164.     VOID
  8165.     (*PFNKSREMOVEEVENT)(
  8166.         IN PFILE_OBJECT FileObject,
  8167.         IN struct _KSEVENT_ENTRY* EventEntry
  8168.         );
  8169.     
  8170.     #define DEFINE_KSEVENT_TABLE(tablename)\
  8171.         const KSEVENT_ITEM tablename[] =
  8172.  
  8173.     #define DEFINE_KSEVENT_ITEM(EventId, DataInput, ExtraEntryData,\
  8174.                                 AddHandler, RemoveHandler, SupportHandler)\
  8175.     {\
  8176.         EventId,\
  8177.         DataInput,\
  8178.         ExtraEntryData,\
  8179.         AddHandler,\
  8180.         RemoveHandler,\
  8181.         SupportHandler\
  8182.     }
  8183.  
  8184.     typedef struct {
  8185.         ULONG               EventId;
  8186.         ULONG               DataInput;
  8187.         ULONG               ExtraEntryData;
  8188.         PFNKSADDEVENT       AddHandler;
  8189.         PFNKSREMOVEEVENT    RemoveHandler;
  8190.         PFNKSHANDLER        SupportHandler;
  8191.     } KSEVENT_ITEM, *PKSEVENT_ITEM;
  8192.  
  8193.     #define DEFINE_KSEVENT_SET(Set,\
  8194.                                EventsCount,\
  8195.                                EventItem)\
  8196.     {\
  8197.         Set, EventsCount, EventItem\
  8198.     }
  8199.  
  8200.     #define DEFINE_KSEVENT_SET_TABLE(tablename)\
  8201.         const KSEVENT_SET tablename[] =
  8202.  
  8203.     typedef struct {
  8204.         const GUID*         Set;
  8205.         ULONG               EventsCount;
  8206.         const KSEVENT_ITEM* EventItem;
  8207.     } KSEVENT_SET, *PKSEVENT_SET;
  8208.  
  8209.     typedef struct {
  8210.         KDPC            Dpc;
  8211.         ULONG           ReferenceCount;
  8212.         KSPIN_LOCK      AccessLock;
  8213.     } KSDPC_ITEM, *PKSDPC_ITEM;
  8214.  
  8215.     typedef struct {
  8216.         KSDPC_ITEM          DpcItem;
  8217.         LIST_ENTRY          BufferList;
  8218.     } KSBUFFER_ITEM, *PKSBUFFER_ITEM;
  8219.  
  8220.     #define KSEVENT_ENTRY_DELETED   1
  8221.     #define KSEVENT_ENTRY_ONESHOT   2
  8222.     #define KSEVENT_ENTRY_BUFFERED  4
  8223.  
  8224.     struct _KSEVENT_ENTRY {
  8225.         LIST_ENTRY      ListEntry;
  8226.         PVOID           Object;
  8227.         union {
  8228.             PKSDPC_ITEM         DpcItem;
  8229.             PKSBUFFER_ITEM      BufferItem;
  8230.         };
  8231.         PKSEVENTDATA        EventData;
  8232.         ULONG               NotificationType;
  8233.         const KSEVENT_SET*  EventSet;
  8234.         const KSEVENT_ITEM* EventItem;
  8235.         PFILE_OBJECT        FileObject;
  8236.         ULONG               SemaphoreAdjustment;
  8237.         ULONG               Reserved;
  8238.         ULONG               Flags;
  8239.     };
  8240.  
  8241.     typedef enum {
  8242.         KSEVENTS_NONE,
  8243.         KSEVENTS_SPINLOCK,
  8244.         KSEVENTS_MUTEX,
  8245.         KSEVENTS_FMUTEX,
  8246.         KSEVENTS_FMUTEXUNSAFE,
  8247.         KSEVENTS_INTERRUPT,
  8248.         KSEVENTS_ERESOURCE
  8249.     } KSEVENTS_LOCKTYPE;
  8250.  
  8251.     #define KSDISPATCH_FASTIO       0x80000000
  8252.  
  8253.     typedef struct {
  8254.         PDRIVER_DISPATCH        Create;
  8255.         PVOID                   Context;
  8256.         UNICODE_STRING          ObjectClass;
  8257.         PSECURITY_DESCRIPTOR    SecurityDescriptor;
  8258.         ULONG                   Flags;
  8259.     } KSOBJECT_CREATE_ITEM, *PKSOBJECT_CREATE_ITEM;
  8260.  
  8261.     typedef
  8262.     VOID
  8263.     (*PFNKSITEMFREECALLBACK)(
  8264.         IN PKSOBJECT_CREATE_ITEM CreateItem
  8265.         );
  8266.  
  8267.     #define KSCREATE_ITEM_SECURITYCHANGED       0x00000001
  8268.     #define KSCREATE_ITEM_WILDCARD              0x00000002
  8269.     #define KSCREATE_ITEM_NOPARAMETERS          0x00000004
  8270.     #define KSCREATE_ITEM_FREEONSTOP            0x00000008
  8271.  
  8272.     #define DEFINE_KSCREATE_DISPATCH_TABLE( tablename )\
  8273.         KSOBJECT_CREATE_ITEM tablename[] =
  8274.  
  8275.     #define DEFINE_KSCREATE_ITEM(DispatchCreate, TypeName, Context)\
  8276.     {\
  8277.         (DispatchCreate),\
  8278.         (PVOID)(Context),\
  8279.         {\
  8280.             sizeof(TypeName) - sizeof(UNICODE_NULL),\
  8281.             sizeof(TypeName),\
  8282.             (PWCHAR)(TypeName)\
  8283.         },\
  8284.         NULL, 0\
  8285.     }
  8286.  
  8287.     #define DEFINE_KSCREATE_ITEMEX(DispatchCreate, TypeName, Context, Flags)\
  8288.     {\
  8289.         (DispatchCreate),\
  8290.         (PVOID)(Context),\
  8291.         {\
  8292.             sizeof(TypeName) - sizeof(UNICODE_NULL),\
  8293.             sizeof(TypeName),\
  8294.             (PWCHAR)(TypeName)\
  8295.         },\
  8296.         NULL, (Flags)\
  8297.     }
  8298.  
  8299.     #define DEFINE_KSCREATE_ITEMNULL( DispatchCreate, Context )\
  8300.     {\
  8301.         DispatchCreate,\
  8302.         Context,\
  8303.         {\
  8304.             0,\
  8305.             0,\
  8306.             NULL,\
  8307.         },\
  8308.         NULL, 0\
  8309.     }
  8310.  
  8311.     typedef struct {
  8312.         ULONG                    CreateItemsCount;
  8313.         PKSOBJECT_CREATE_ITEM    CreateItemsList;
  8314.     } KSOBJECT_CREATE, *PKSOBJECT_CREATE;
  8315.  
  8316.     typedef struct {
  8317.         PDRIVER_DISPATCH        DeviceIoControl;
  8318.         PDRIVER_DISPATCH        Read;
  8319.         PDRIVER_DISPATCH        Write;
  8320.         PDRIVER_DISPATCH        Flush;
  8321.         PDRIVER_DISPATCH        Close;
  8322.         PDRIVER_DISPATCH        QuerySecurity;
  8323.         PDRIVER_DISPATCH        SetSecurity;
  8324.         PFAST_IO_DEVICE_CONTROL FastDeviceIoControl;
  8325.         PFAST_IO_READ           FastRead;
  8326.         PFAST_IO_WRITE          FastWrite;
  8327.     } KSDISPATCH_TABLE, *PKSDISPATCH_TABLE;
  8328.  
  8329.     #define DEFINE_KSDISPATCH_TABLE( tablename, DeviceIoControl, Read, Write,\
  8330.                                      Flush, Close, QuerySecurity, SetSecurity,\
  8331.                                      FastDeviceIoControl, FastRead, FastWrite  )\
  8332.         const KSDISPATCH_TABLE tablename = \
  8333.         {\
  8334.             DeviceIoControl,        \
  8335.             Read,                   \
  8336.             Write,                  \
  8337.             Flush,                  \
  8338.             Close,                  \
  8339.             QuerySecurity,          \
  8340.             SetSecurity,            \
  8341.             FastDeviceIoControl,    \
  8342.             FastRead,               \
  8343.             FastWrite,              \
  8344.         }
  8345.  
  8346.     #define KSCREATE_ITEM_IRP_STORAGE(Irp)      ((PKSOBJECT_CREATE_ITEM)(Irp)->Tail.Overlay.DriverContext[0])
  8347.     #define KSEVENT_SET_IRP_STORAGE(Irp)        ((const KSEVENT_SET*)(Irp)->Tail.Overlay.DriverContext[0])
  8348.     #define KSEVENT_ITEM_IRP_STORAGE(Irp)       ((const KSEVENT_ITEM*)(Irp)->Tail.Overlay.DriverContext[3])
  8349.     #define KSEVENT_ENTRY_IRP_STORAGE(Irp)      ((PKSEVENT_ENTRY)(Irp)->Tail.Overlay.DriverContext[0])
  8350.     #define KSMETHOD_SET_IRP_STORAGE(Irp)       ((const KSMETHOD_SET*)(Irp)->Tail.Overlay.DriverContext[0])
  8351.     #define KSMETHOD_ITEM_IRP_STORAGE(Irp)      ((const KSMETHOD_ITEM*)(Irp)->Tail.Overlay.DriverContext[3])
  8352.     #define KSMETHOD_TYPE_IRP_STORAGE(Irp)      ((ULONG_PTR)((Irp)->Tail.Overlay.DriverContext[2]))
  8353.     #define KSQUEUE_SPINLOCK_IRP_STORAGE(Irp)   ((PKSPIN_LOCK)(Irp)->Tail.Overlay.DriverContext[1])
  8354.     #define KSPROPERTY_SET_IRP_STORAGE(Irp)     ((const KSPROPERTY_SET*)(Irp)->Tail.Overlay.DriverContext[0])
  8355.     #define KSPROPERTY_ITEM_IRP_STORAGE(Irp)    ((const KSPROPERTY_ITEM*)(Irp)->Tail.Overlay.DriverContext[3])
  8356.     #define KSPROPERTY_ATTRIBUTES_IRP_STORAGE(Irp) ((PKSATTRIBUTE_LIST)(Irp)->Tail.Overlay.DriverContext[2])
  8357.  
  8358.     typedef PVOID   KSDEVICE_HEADER, KSOBJECT_HEADER;
  8359.  
  8360.     typedef enum {
  8361.         KsInvokeOnSuccess = 1,
  8362.         KsInvokeOnError = 2,
  8363.         KsInvokeOnCancel = 4
  8364.     } KSCOMPLETION_INVOCATION;
  8365.  
  8366.     typedef enum {
  8367.         KsListEntryTail,
  8368.         KsListEntryHead
  8369.     } KSLIST_ENTRY_LOCATION;
  8370.  
  8371.     typedef enum {
  8372.         KsAcquireOnly,
  8373.         KsAcquireAndRemove,
  8374.         KsAcquireOnlySingleItem,
  8375.         KsAcquireAndRemoveOnlySingleItem
  8376.     } KSIRP_REMOVAL_OPERATION;
  8377.  
  8378.     typedef enum {
  8379.         KsStackCopyToNewLocation,
  8380.         KsStackReuseCurrentLocation,
  8381.         KsStackUseNewLocation
  8382.     } KSSTACK_USE;
  8383.  
  8384.     typedef enum {
  8385.         KSTARGET_STATE_DISABLED,
  8386.         KSTARGET_STATE_ENABLED
  8387.     } KSTARGET_STATE;
  8388.  
  8389.     typedef
  8390.     NTSTATUS
  8391.     (*PFNKSIRPLISTCALLBACK)(
  8392.         IN PIRP Irp,
  8393.         IN PVOID Context
  8394.         );
  8395.  
  8396.     typedef 
  8397.     VOID 
  8398.     (*PFNREFERENCEDEVICEOBJECT)( 
  8399.         IN PVOID Context
  8400.         );
  8401.     
  8402.     typedef 
  8403.     VOID 
  8404.     (*PFNDEREFERENCEDEVICEOBJECT)( 
  8405.         IN PVOID Context
  8406.         );
  8407.     
  8408.     typedef
  8409.     NTSTATUS
  8410.     (*PFNQUERYREFERENCESTRING)( 
  8411.         IN PVOID Context,
  8412.         IN OUT PWCHAR *String
  8413.         );
  8414.  
  8415.     #define BUS_INTERFACE_REFERENCE_VERSION    0x100
  8416.     
  8417.     typedef struct {
  8418.         //
  8419.         // Standard interface header
  8420.         //
  8421.     
  8422.         INTERFACE                   Interface;
  8423.     
  8424.         //
  8425.         // Standard bus interfaces
  8426.         //
  8427.     
  8428.         PFNREFERENCEDEVICEOBJECT    ReferenceDeviceObject;
  8429.         PFNDEREFERENCEDEVICEOBJECT  DereferenceDeviceObject;
  8430.         PFNQUERYREFERENCESTRING     QueryReferenceString;
  8431.     
  8432.     } BUS_INTERFACE_REFERENCE, *PBUS_INTERFACE_REFERENCE;
  8433.  
  8434.     #define STATIC_REFERENCE_BUS_INTERFACE STATIC_KSMEDIUMSETID_Standard
  8435.     #define REFERENCE_BUS_INTERFACE KSMEDIUMSETID_Standard
  8436.  
  8437.     typedef
  8438.     NTSTATUS
  8439.     (*PFNQUERYMEDIUMSLIST)( 
  8440.         IN PVOID Context,
  8441.         OUT ULONG* MediumsCount,
  8442.         OUT PKSPIN_MEDIUM* MediumList
  8443.         );
  8444.  
  8445.     typedef struct {
  8446.         //
  8447.         // Standard interface header
  8448.         //
  8449.     
  8450.         INTERFACE                   Interface;
  8451.     
  8452.         //
  8453.         // Interface definition
  8454.         //
  8455.     
  8456.         PFNQUERYMEDIUMSLIST         QueryMediumsList;
  8457.     
  8458.     } BUS_INTERFACE_MEDIUMS, *PBUS_INTERFACE_MEDIUMS;
  8459.  
  8460.     #define STATIC_GUID_BUS_INTERFACE_MEDIUMS \
  8461.         0x4EC35C3EL, 0x201B, 0x11D2, 0x87, 0x45, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  8462.     DEFINE_GUIDSTRUCT("4EC35C3E-201B-11D2-8745-00A0C9223196", GUID_BUS_INTERFACE_MEDIUMS);
  8463.     #define GUID_BUS_INTERFACE_MEDIUMS DEFINE_GUIDNAMED(GUID_BUS_INTERFACE_MEDIUMS)
  8464.  
  8465.     #endif // defined(_NTDDK_)
  8466.  
  8467.     #if !defined( PACK_PRAGMAS_NOT_SUPPORTED )
  8468.     #include <pshpack1.h>
  8469.     #endif
  8470.  
  8471.     typedef struct {
  8472.         GUID            PropertySet;
  8473.         ULONG           Count;
  8474.     } KSPROPERTY_SERIALHDR, *PKSPROPERTY_SERIALHDR;
  8475.  
  8476.     #if !defined( PACK_PRAGMAS_NOT_SUPPORTED )
  8477.     #include <poppack.h>
  8478.     #endif
  8479.  
  8480.     typedef struct {
  8481.         KSIDENTIFIER    PropTypeSet;
  8482.         ULONG           Id;
  8483.         ULONG           PropertyLength;
  8484.     } KSPROPERTY_SERIAL, *PKSPROPERTY_SERIAL;
  8485.  
  8486.     #if defined(_NTDDK_)
  8487.  
  8488.     #define IOCTL_KS_HANDSHAKE             CTL_CODE(FILE_DEVICE_KS, 0x007, METHOD_NEITHER, FILE_ANY_ACCESS)
  8489.  
  8490.     typedef struct {
  8491.         GUID ProtocolId;
  8492.         PVOID Argument1;
  8493.         PVOID Argument2;
  8494.     } KSHANDSHAKE, *PKSHANDSHAKE;
  8495.  
  8496.     typedef struct _KSGATE
  8497.     KSGATE, *PKSGATE;
  8498.  
  8499.     struct _KSGATE {
  8500.         LONG Count;
  8501.         PKSGATE NextGate;
  8502.     };
  8503.  
  8504.     #ifndef _NTOS_
  8505.  
  8506.     void __inline
  8507.     KsGateTurnInputOn(
  8508.         IN PKSGATE Gate OPTIONAL
  8509.         )
  8510.     {
  8511.         while (Gate && (InterlockedIncrement(&Gate->Count) == 1)) {
  8512.             Gate = Gate->NextGate;
  8513.         }
  8514.     }
  8515.  
  8516.     void __inline
  8517.     KsGateTurnInputOff(
  8518.         IN PKSGATE Gate OPTIONAL
  8519.         )
  8520.     {
  8521.         while (Gate && (InterlockedDecrement(&Gate->Count) == 0)) {
  8522.             Gate = Gate->NextGate;
  8523.         }
  8524.     }
  8525.  
  8526.     BOOLEAN __inline
  8527.     KsGateGetStateUnsafe(
  8528.         IN PKSGATE Gate
  8529.         )
  8530.     {
  8531.         ASSERT(Gate);
  8532.         return Gate->Count > 0;
  8533.     }
  8534.  
  8535.     BOOLEAN __inline
  8536.     KsGateCaptureThreshold(
  8537.         IN PKSGATE Gate
  8538.         )
  8539.     {
  8540.         BOOLEAN captured;
  8541.  
  8542.         ASSERT(Gate);
  8543.  
  8544.         captured = (InterlockedCompareExchange(&Gate->Count,0,1) == 1);
  8545.     
  8546.         //
  8547.         // If we made a transition, it must be propagated.
  8548.         //
  8549.         if (captured) {
  8550.             KsGateTurnInputOff(Gate->NextGate);
  8551.         }
  8552.  
  8553.         //
  8554.         // We return whatever the state was prior to the compare/exchange.  If
  8555.         // the state was on, the state is now off.
  8556.         //
  8557.         return captured;
  8558.     }
  8559.  
  8560.     void __inline
  8561.     KsGateInitialize(
  8562.         IN PKSGATE Gate,
  8563.         IN LONG InitialCount,
  8564.         IN PKSGATE NextGate OPTIONAL,
  8565.         IN BOOLEAN StateToPropagate // IN BOOLEAN NextGateIsAnOrGate
  8566.         )
  8567.     {
  8568.         ASSERT(Gate);
  8569.         Gate->Count = InitialCount;
  8570.         Gate->NextGate = NextGate;
  8571.  
  8572.         if (NextGate) {
  8573.             if (InitialCount > 0) {
  8574.                 if (StateToPropagate) {
  8575.                     KsGateTurnInputOn(NextGate);
  8576.                 }
  8577.             } else {
  8578.                 if (! StateToPropagate) {
  8579.                     KsGateTurnInputOff(NextGate);
  8580.                 }
  8581.             }
  8582.         }
  8583.     }
  8584.  
  8585.     void __inline
  8586.     KsGateInitializeAnd(
  8587.         IN PKSGATE AndGate,
  8588.         IN PKSGATE NextOrGate OPTIONAL
  8589.         )
  8590.     {
  8591.         KsGateInitialize(AndGate,1,NextOrGate,TRUE);
  8592.     }
  8593.  
  8594.     void __inline
  8595.     KsGateInitializeOr(
  8596.         IN PKSGATE OrGate,
  8597.         IN PKSGATE NextAndGate OPTIONAL
  8598.         )
  8599.     {
  8600.         KsGateInitialize(OrGate,0,NextAndGate,FALSE);
  8601.     }
  8602.  
  8603.     void __inline KsGateAddOnInputToAnd(IN PKSGATE AndGate) {}
  8604.     void __inline KsGateAddOffInputToAnd(IN PKSGATE AndGate) { KsGateTurnInputOff(AndGate); }
  8605.     void __inline KsGateRemoveOnInputFromAnd(IN PKSGATE AndGate) {}
  8606.     void __inline KsGateRemoveOffInputFromAnd(IN PKSGATE AndGate) { KsGateTurnInputOn(AndGate); }
  8607.  
  8608.     void __inline KsGateAddOnInputToOr(IN PKSGATE OrGate) { KsGateTurnInputOn(OrGate); }
  8609.     void __inline KsGateAddOffInputToOr(IN PKSGATE OrGate) {}
  8610.     void __inline KsGateRemoveOnInputFromOr(IN PKSGATE OrGate) { KsGateTurnInputOff(OrGate); }
  8611.     void __inline KsGateRemoveOffInputFromOr(IN PKSGATE OrGate) {}
  8612.  
  8613.     void __inline
  8614.     KsGateTerminateAnd(
  8615.         IN PKSGATE AndGate
  8616.         )
  8617.     {
  8618.         ASSERT(AndGate);
  8619.         if (KsGateGetStateUnsafe(AndGate)) {
  8620.             KsGateRemoveOnInputFromOr(AndGate->NextGate);
  8621.         } else {
  8622.             KsGateRemoveOffInputFromOr(AndGate->NextGate);
  8623.         }
  8624.     }
  8625.  
  8626.     void __inline
  8627.     KsGateTerminateOr(
  8628.         IN PKSGATE OrGate
  8629.         )
  8630.     {
  8631.         ASSERT(OrGate);
  8632.         if (KsGateGetStateUnsafe(OrGate)) {
  8633.             KsGateRemoveOnInputFromAnd(OrGate->NextGate);
  8634.         } else {
  8635.             KsGateRemoveOffInputFromAnd(OrGate->NextGate);
  8636.         }
  8637.     }
  8638.  
  8639.     #endif // !_NTOS_
  8640.  
  8641.     typedef PVOID KSOBJECT_BAG;
  8642.  
  8643.     typedef
  8644.     BOOLEAN
  8645.     (*PFNKSGENERATEEVENTCALLBACK)(
  8646.         IN PVOID Context,
  8647.         IN PKSEVENT_ENTRY EventEntry
  8648.         );
  8649.  
  8650.     typedef
  8651.     NTSTATUS
  8652.     (*PFNKSDEVICECREATE)(
  8653.         IN PKSDEVICE Device
  8654.         );
  8655.     typedef
  8656.     NTSTATUS
  8657.     (*PFNKSDEVICEPNPSTART)(
  8658.         IN PKSDEVICE Device,
  8659.         IN PIRP Irp,
  8660.         IN PCM_RESOURCE_LIST TranslatedResourceList OPTIONAL,
  8661.         IN PCM_RESOURCE_LIST UntranslatedResourceList OPTIONAL
  8662.         );
  8663.     typedef
  8664.     NTSTATUS
  8665.     (*PFNKSDEVICE)(
  8666.         IN PKSDEVICE Device
  8667.         );
  8668.     typedef
  8669.     NTSTATUS
  8670.     (*PFNKSDEVICEIRP)(
  8671.         IN PKSDEVICE Device,
  8672.         IN PIRP Irp
  8673.         );
  8674.     typedef
  8675.     void
  8676.     (*PFNKSDEVICEIRPVOID)(
  8677.         IN PKSDEVICE Device,
  8678.         IN PIRP Irp
  8679.         );
  8680.     typedef
  8681.     NTSTATUS
  8682.     (*PFNKSDEVICEQUERYCAPABILITIES)(
  8683.         IN PKSDEVICE Device,
  8684.         IN PIRP Irp,
  8685.         IN OUT PDEVICE_CAPABILITIES Capabilities
  8686.         );
  8687.     typedef
  8688.     NTSTATUS
  8689.     (*PFNKSDEVICEQUERYPOWER)(
  8690.         IN PKSDEVICE Device,
  8691.         IN PIRP Irp,
  8692.         IN DEVICE_POWER_STATE DeviceTo,
  8693.         IN DEVICE_POWER_STATE DeviceFrom,
  8694.         IN SYSTEM_POWER_STATE SystemTo,
  8695.         IN SYSTEM_POWER_STATE SystemFrom,
  8696.         IN POWER_ACTION Action
  8697.         );
  8698.     typedef
  8699.     void
  8700.     (*PFNKSDEVICESETPOWER)(
  8701.         IN PKSDEVICE Device,
  8702.         IN PIRP Irp,
  8703.         IN DEVICE_POWER_STATE To,
  8704.         IN DEVICE_POWER_STATE From
  8705.         );
  8706.     typedef
  8707.     NTSTATUS
  8708.     (*PFNKSFILTERFACTORYVOID)(
  8709.         IN PKSFILTERFACTORY FilterFactory
  8710.         );
  8711.     typedef
  8712.     void
  8713.     (*PFNKSFILTERFACTORYPOWER)(
  8714.         IN PKSFILTERFACTORY FilterFactory,
  8715.         IN DEVICE_POWER_STATE State
  8716.         );
  8717.     typedef
  8718.     NTSTATUS
  8719.     (*PFNKSFILTERIRP)(
  8720.         IN PKSFILTER Filter,
  8721.         IN PIRP Irp
  8722.         );
  8723.     typedef
  8724.     NTSTATUS
  8725.     (*PFNKSFILTERPROCESS)(
  8726.         IN PKSFILTER Filter,
  8727.         IN PKSPROCESSPIN_INDEXENTRY Index
  8728.         );
  8729.     typedef
  8730.     NTSTATUS
  8731.     (*PFNKSFILTERVOID)(
  8732.         IN PKSFILTER Filter
  8733.         );
  8734.     typedef
  8735.     void
  8736.     (*PFNKSFILTERPOWER)(
  8737.         IN PKSFILTER Filter,
  8738.         IN DEVICE_POWER_STATE State
  8739.         );
  8740.     typedef
  8741.     NTSTATUS
  8742.     (*PFNKSPINIRP)(
  8743.         IN PKSPIN Pin,
  8744.         IN PIRP Irp
  8745.         );
  8746.     typedef
  8747.     NTSTATUS
  8748.     (*PFNKSPINSETDEVICESTATE)(
  8749.         IN PKSPIN Pin,
  8750.         IN KSSTATE ToState,
  8751.         IN KSSTATE FromState
  8752.         );
  8753.     typedef
  8754.     NTSTATUS
  8755.     (*PFNKSPINSETDATAFORMAT)(
  8756.         IN PKSPIN Pin,
  8757.         IN PKSDATAFORMAT OldFormat OPTIONAL,
  8758.         IN PKSMULTIPLE_ITEM OldAttributeList OPTIONAL,
  8759.         IN const KSDATARANGE* DataRange,
  8760.         IN const KSATTRIBUTE_LIST* AttributeRange OPTIONAL
  8761.         );
  8762.     typedef
  8763.     NTSTATUS
  8764.     (*PFNKSPINHANDSHAKE)(
  8765.         IN PKSPIN Pin,
  8766.         IN PKSHANDSHAKE In,
  8767.         IN PKSHANDSHAKE Out
  8768.         );
  8769.     typedef
  8770.     NTSTATUS
  8771.     (*PFNKSPIN)(
  8772.         IN PKSPIN Pin
  8773.         );
  8774.     typedef
  8775.     void
  8776.     (*PFNKSPINVOID)(
  8777.         IN PKSPIN Pin
  8778.         );
  8779.     typedef
  8780.     void
  8781.     (*PFNKSPINPOWER)(
  8782.         IN PKSPIN Pin,
  8783.         IN DEVICE_POWER_STATE State
  8784.         );
  8785.     typedef
  8786.     BOOLEAN
  8787.     (*PFNKSPINSETTIMER)(
  8788.         IN PKSPIN Pin,
  8789.         IN PKTIMER Timer,
  8790.         IN LARGE_INTEGER DueTime,
  8791.         IN PKDPC Dpc
  8792.         );
  8793.     typedef
  8794.     BOOLEAN
  8795.     (*PFNKSPINCANCELTIMER)(
  8796.         IN PKSPIN Pin,
  8797.         IN PKTIMER Timer
  8798.         );
  8799.     typedef
  8800.     LONGLONG
  8801.     (FASTCALL *PFNKSPINCORRELATEDTIME)(
  8802.         IN PKSPIN Pin,
  8803.         OUT PLONGLONG SystemTime
  8804.         );
  8805.     typedef
  8806.     void
  8807.     (*PFNKSPINRESOLUTION)(
  8808.         IN PKSPIN Pin,
  8809.         OUT PKSRESOLUTION Resolution
  8810.         );
  8811.     typedef
  8812.     NTSTATUS
  8813.     (*PFNKSPININITIALIZEALLOCATOR)(
  8814.         IN PKSPIN Pin,
  8815.         IN PKSALLOCATOR_FRAMING AllocatorFraming,
  8816.         OUT PVOID* Context
  8817.         );
  8818.     typedef
  8819.     void
  8820.     (*PFNKSSTREAMPOINTER)(
  8821.         IN PKSSTREAM_POINTER StreamPointer
  8822.         );
  8823.  
  8824.     typedef struct KSAUTOMATION_TABLE_ 
  8825.     KSAUTOMATION_TABLE, *PKSAUTOMATION_TABLE;
  8826.     struct KSAUTOMATION_TABLE_ {
  8827.         ULONG PropertySetsCount;
  8828.         ULONG PropertyItemSize;
  8829.         const KSPROPERTY_SET* PropertySets;
  8830.         ULONG MethodSetsCount;
  8831.         ULONG MethodItemSize;
  8832.         const KSMETHOD_SET* MethodSets;
  8833.         ULONG EventSetsCount;
  8834.         ULONG EventItemSize;
  8835.         const KSEVENT_SET* EventSets;
  8836.     #if !defined(_WIN64)
  8837.         PVOID Alignment;
  8838.     #endif // !defined(_WIN64)
  8839.     };
  8840.  
  8841.     #define DEFINE_KSAUTOMATION_TABLE(table)\
  8842.         const KSAUTOMATION_TABLE table =
  8843.  
  8844.     #define DEFINE_KSAUTOMATION_PROPERTIES(table)\
  8845.         SIZEOF_ARRAY(table),\
  8846.         sizeof(KSPROPERTY_ITEM),\
  8847.         table
  8848.  
  8849.     #define DEFINE_KSAUTOMATION_METHODS(table)\
  8850.         SIZEOF_ARRAY(table),\
  8851.         sizeof(KSMETHOD_ITEM),\
  8852.         table
  8853.  
  8854.     #define DEFINE_KSAUTOMATION_EVENTS(table)\
  8855.         SIZEOF_ARRAY(table),\
  8856.         sizeof(KSEVENT_ITEM),\
  8857.         table
  8858.  
  8859.     #define DEFINE_KSAUTOMATION_PROPERTIES_NULL\
  8860.         0,\
  8861.         sizeof(KSPROPERTY_ITEM),\
  8862.         NULL
  8863.  
  8864.     #define DEFINE_KSAUTOMATION_METHODS_NULL\
  8865.         0,\
  8866.         sizeof(KSMETHOD_ITEM),\
  8867.         NULL
  8868.  
  8869.     #define DEFINE_KSAUTOMATION_EVENTS_NULL\
  8870.         0,\
  8871.         sizeof(KSEVENT_ITEM),\
  8872.         NULL
  8873.  
  8874.     #define MIN_DEV_VER_FOR_QI (0x100)
  8875.  
  8876.     struct _KSDEVICE_DISPATCH {
  8877.         PFNKSDEVICECREATE Add;
  8878.         PFNKSDEVICEPNPSTART Start;
  8879.         PFNKSDEVICE PostStart;
  8880.         PFNKSDEVICEIRP QueryStop;
  8881.         PFNKSDEVICEIRPVOID CancelStop;
  8882.         PFNKSDEVICEIRPVOID Stop;
  8883.         PFNKSDEVICEIRP QueryRemove;
  8884.         PFNKSDEVICEIRPVOID CancelRemove;
  8885.         PFNKSDEVICEIRPVOID Remove;
  8886.         PFNKSDEVICEQUERYCAPABILITIES QueryCapabilities;
  8887.         PFNKSDEVICEIRPVOID SurpriseRemoval;
  8888.         PFNKSDEVICEQUERYPOWER QueryPower;
  8889.         PFNKSDEVICESETPOWER SetPower;
  8890.         PFNKSDEVICEIRP QueryInterface;  // added in version 0x100
  8891.     };
  8892.  
  8893.     struct _KSFILTER_DISPATCH {
  8894.         PFNKSFILTERIRP Create;
  8895.         PFNKSFILTERIRP Close;
  8896.         PFNKSFILTERPROCESS Process;
  8897.         PFNKSFILTERVOID Reset;
  8898.     };
  8899.  
  8900.     struct _KSPIN_DISPATCH {
  8901.         PFNKSPINIRP Create;
  8902.         PFNKSPINIRP Close;
  8903.         PFNKSPIN Process;
  8904.         PFNKSPINVOID Reset;
  8905.         PFNKSPINSETDATAFORMAT SetDataFormat;
  8906.         PFNKSPINSETDEVICESTATE SetDeviceState;
  8907.         PFNKSPIN Connect;
  8908.         PFNKSPINVOID Disconnect;
  8909.         const KSCLOCK_DISPATCH* Clock;
  8910.         const KSALLOCATOR_DISPATCH* Allocator;
  8911.     };
  8912.  
  8913.     struct _KSCLOCK_DISPATCH {
  8914.         PFNKSPINSETTIMER SetTimer;
  8915.         PFNKSPINCANCELTIMER CancelTimer;
  8916.         PFNKSPINCORRELATEDTIME CorrelatedTime;
  8917.         PFNKSPINRESOLUTION Resolution;
  8918.     };
  8919.  
  8920.     struct _KSALLOCATOR_DISPATCH {
  8921.         PFNKSPININITIALIZEALLOCATOR InitializeAllocator;
  8922.         PFNKSDELETEALLOCATOR DeleteAllocator;
  8923.         PFNKSDEFAULTALLOCATE Allocate;
  8924.         PFNKSDEFAULTFREE Free;
  8925.     };
  8926.  
  8927.     #define KSDEVICE_DESCRIPTOR_VERSION (0x100)
  8928.  
  8929.     struct _KSDEVICE_DESCRIPTOR {
  8930.         const KSDEVICE_DISPATCH* Dispatch;
  8931.         ULONG FilterDescriptorsCount;
  8932.         const KSFILTER_DESCRIPTOR*const* FilterDescriptors;
  8933.         ULONG Version; // this is 0 for pre-version 100 driver
  8934.         //#if !defined(_WIN64)
  8935.         //PVOID Alignment;
  8936.         //#endif //!defined(_WIN64)
  8937.     };
  8938.  
  8939.     struct _KSFILTER_DESCRIPTOR {
  8940.         const KSFILTER_DISPATCH* Dispatch;
  8941.         const KSAUTOMATION_TABLE* AutomationTable;
  8942.         ULONG Version;
  8943.     #define KSFILTER_DESCRIPTOR_VERSION ((ULONG)-1)
  8944.         ULONG Flags;
  8945.     #define KSFILTER_FLAG_DISPATCH_LEVEL_PROCESSING 0x00000001
  8946.     #define KSFILTER_FLAG_CRITICAL_PROCESSING 0x00000002
  8947.     #define KSFILTER_FLAG_HYPERCRITICAL_PROCESSING 0x00000004
  8948.         const GUID* ReferenceGuid;
  8949.         ULONG PinDescriptorsCount;
  8950.         ULONG PinDescriptorSize;
  8951.         const KSPIN_DESCRIPTOR_EX* PinDescriptors;
  8952.         ULONG CategoriesCount;
  8953.         const GUID* Categories;
  8954.         ULONG NodeDescriptorsCount;
  8955.         ULONG NodeDescriptorSize;
  8956.         const KSNODE_DESCRIPTOR* NodeDescriptors;
  8957.         ULONG ConnectionsCount;
  8958.         const KSTOPOLOGY_CONNECTION* Connections;
  8959.         const KSCOMPONENTID* ComponentId;
  8960.     };
  8961.  
  8962.     #define DEFINE_KSFILTER_DESCRIPTOR(descriptor)\
  8963.         const KSFILTER_DESCRIPTOR descriptor =
  8964.  
  8965.     #define DEFINE_KSFILTER_PIN_DESCRIPTORS(table)\
  8966.         SIZEOF_ARRAY(table),\
  8967.         sizeof(table[0]),\
  8968.         table
  8969.  
  8970.     #define DEFINE_KSFILTER_CATEGORIES(table)\
  8971.         SIZEOF_ARRAY(table),\
  8972.         table
  8973.  
  8974.     #define DEFINE_KSFILTER_CATEGORY(category)\
  8975.         1,\
  8976.         &(category)
  8977.  
  8978.     #define DEFINE_KSFILTER_CATEGORIES_NULL\
  8979.         0,\
  8980.         NULL
  8981.  
  8982.     #define DEFINE_KSFILTER_NODE_DESCRIPTORS(table)\
  8983.         SIZEOF_ARRAY(table),\
  8984.         sizeof(table[0]),\
  8985.         table
  8986.  
  8987.     #define DEFINE_KSFILTER_NODE_DESCRIPTORS_NULL\
  8988.         0,\
  8989.         sizeof(KSNODE_DESCRIPTOR),\
  8990.         NULL
  8991.  
  8992.     #define DEFINE_KSFILTER_CONNECTIONS(table)\
  8993.         SIZEOF_ARRAY(table),\
  8994.         table
  8995.  
  8996.     #define DEFINE_KSFILTER_DEFAULT_CONNECTIONS\
  8997.         0,\
  8998.         NULL
  8999.  
  9000.     #define DEFINE_KSFILTER_DESCRIPTOR_TABLE(table)\
  9001.         const KSFILTER_DESCRIPTOR*const table[] =
  9002.  
  9003.     struct _KSPIN_DESCRIPTOR_EX {
  9004.         const KSPIN_DISPATCH* Dispatch;
  9005.         const KSAUTOMATION_TABLE* AutomationTable;
  9006.         KSPIN_DESCRIPTOR PinDescriptor;
  9007.         ULONG Flags;
  9008.     #define KSPIN_FLAG_DISPATCH_LEVEL_PROCESSING KSFILTER_FLAG_DISPATCH_LEVEL_PROCESSING
  9009.     #define KSPIN_FLAG_CRITICAL_PROCESSING KSFILTER_FLAG_CRITICAL_PROCESSING
  9010.     #define KSPIN_FLAG_HYPERCRITICAL_PROCESSING KSFILTER_FLAG_HYPERCRITICAL_PROCESSING
  9011.     #define KSPIN_FLAG_ASYNCHRONOUS_PROCESSING 0x00000008
  9012.     #define KSPIN_FLAG_DO_NOT_INITIATE_PROCESSING 0x00000010
  9013.     #define KSPIN_FLAG_INITIATE_PROCESSING_ON_EVERY_ARRIVAL 0x00000020
  9014.     #define KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING 0x00000040
  9015.     #define KSPIN_FLAG_ENFORCE_FIFO 0x00000080
  9016.  
  9017.     #define KSPIN_FLAG_GENERATE_MAPPINGS 0x00000100
  9018.     #define KSPIN_FLAG_DISTINCT_TRAILING_EDGE 0x00000200
  9019.  
  9020.     #define KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY 0x00010000
  9021.     #define KSPIN_FLAG_SPLITTER 0x00020000
  9022.     #define KSPIN_FLAG_USE_STANDARD_TRANSPORT 0x00040000
  9023.     #define KSPIN_FLAG_DO_NOT_USE_STANDARD_TRANSPORT 0x00080000
  9024.     #define KSPIN_FLAG_FIXED_FORMAT 0x00100000
  9025.     #define KSPIN_FLAG_GENERATE_EOS_EVENTS 0x00200000
  9026.     #define KSPIN_FLAG_RENDERER (KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY|KSPIN_FLAG_GENERATE_EOS_EVENTS)
  9027.     #define KSPIN_FLAG_IMPLEMENT_CLOCK 0x00400000
  9028.         ULONG InstancesPossible;
  9029.         ULONG InstancesNecessary;
  9030.         const KSALLOCATOR_FRAMING_EX* AllocatorFraming;
  9031.         PFNKSINTERSECTHANDLEREX IntersectHandler;
  9032.     };
  9033.  
  9034.     #define DEFINE_KSPIN_DEFAULT_INTERFACES\
  9035.         0,\
  9036.         NULL
  9037.  
  9038.     #define DEFINE_KSPIN_DEFAULT_MEDIUMS\
  9039.         0,\
  9040.         NULL
  9041.  
  9042.     struct _KSNODE_DESCRIPTOR {
  9043.         const KSAUTOMATION_TABLE* AutomationTable;
  9044.         const GUID* Type;
  9045.         const GUID* Name;
  9046.     #if !defined(_WIN64)
  9047.         PVOID Alignment;
  9048.     #endif // !defined(_WIN64)
  9049.     };
  9050.  
  9051.     #if !defined(_WIN64)
  9052.     #define DEFINE_NODE_DESCRIPTOR(automation,type,name) \
  9053.         { (automation), (type), (name), NULL }
  9054.     #else // !defined(_WIN64)
  9055.     #define DEFINE_NODE_DESCRIPTOR(automation,type,name) \
  9056.         { (automation), (type), (name) }
  9057.     #endif // !defined(_WIN64)
  9058.  
  9059.     struct _KSDEVICE {
  9060.         const KSDEVICE_DESCRIPTOR* Descriptor;
  9061.         KSOBJECT_BAG Bag;
  9062.         PVOID Context;
  9063.         PDEVICE_OBJECT FunctionalDeviceObject;
  9064.         PDEVICE_OBJECT PhysicalDeviceObject;
  9065.         PDEVICE_OBJECT NextDeviceObject;
  9066.         BOOLEAN Started;
  9067.         SYSTEM_POWER_STATE SystemPowerState;
  9068.         DEVICE_POWER_STATE DevicePowerState;
  9069.     };
  9070.  
  9071.     struct _KSFILTERFACTORY {
  9072.         const KSFILTER_DESCRIPTOR* FilterDescriptor;
  9073.         KSOBJECT_BAG Bag;
  9074.         PVOID Context;
  9075.     };
  9076.  
  9077.     struct _KSFILTER {
  9078.         const KSFILTER_DESCRIPTOR* Descriptor;
  9079.         KSOBJECT_BAG Bag;
  9080.         PVOID Context;
  9081.     };
  9082.  
  9083.     struct _KSPIN {
  9084.         const KSPIN_DESCRIPTOR_EX* Descriptor;
  9085.         KSOBJECT_BAG Bag;
  9086.         PVOID Context;
  9087.         ULONG Id;
  9088.         KSPIN_COMMUNICATION Communication;
  9089.         BOOLEAN ConnectionIsExternal;
  9090.         KSPIN_INTERFACE ConnectionInterface;
  9091.         KSPIN_MEDIUM ConnectionMedium;
  9092.         KSPRIORITY ConnectionPriority;
  9093.         PKSDATAFORMAT ConnectionFormat;
  9094.         PKSMULTIPLE_ITEM AttributeList;
  9095.         ULONG StreamHeaderSize;
  9096.         KSPIN_DATAFLOW DataFlow;
  9097.         KSSTATE DeviceState;
  9098.         KSRESET ResetState;
  9099.     };
  9100.  
  9101.     struct _KSMAPPING {
  9102.         PHYSICAL_ADDRESS PhysicalAddress;
  9103.         ULONG ByteCount;
  9104.         ULONG Alignment;
  9105.     };
  9106.  
  9107.     struct _KSSTREAM_POINTER_OFFSET
  9108.     {
  9109.     #if defined(_NTDDK_)
  9110.         union {
  9111.             PUCHAR Data;
  9112.             PKSMAPPING Mappings;
  9113.         };
  9114.     #else // !defined(_NTDDK_)
  9115.         PUCHAR Data;
  9116.     #endif // !defined(_NTDDK_)
  9117.     #if !defined(_WIN64)
  9118.         PVOID Alignment;
  9119.     #endif // !defined(_WIN64)
  9120.         ULONG Count;
  9121.         ULONG Remaining;
  9122.     };
  9123.  
  9124.     struct _KSSTREAM_POINTER
  9125.     {
  9126.         PVOID Context;
  9127.         PKSPIN Pin;
  9128.         PKSSTREAM_HEADER StreamHeader;
  9129.         PKSSTREAM_POINTER_OFFSET Offset;
  9130.         KSSTREAM_POINTER_OFFSET OffsetIn;
  9131.         KSSTREAM_POINTER_OFFSET OffsetOut;
  9132.     };
  9133.  
  9134.     struct _KSPROCESSPIN {
  9135.         PKSPIN Pin;
  9136.         PKSSTREAM_POINTER StreamPointer;
  9137.         PKSPROCESSPIN InPlaceCounterpart;
  9138.         PKSPROCESSPIN DelegateBranch;
  9139.         PKSPROCESSPIN CopySource;
  9140.         PVOID Data;
  9141.         ULONG BytesAvailable;
  9142.         ULONG BytesUsed;
  9143.         ULONG Flags;
  9144.         BOOLEAN Terminate;
  9145.     };
  9146.  
  9147.     struct _KSPROCESSPIN_INDEXENTRY {
  9148.         PKSPROCESSPIN *Pins;
  9149.         ULONG Count;
  9150.     };
  9151.  
  9152.     typedef enum {
  9153.         KsObjectTypeDevice,
  9154.         KsObjectTypeFilterFactory,
  9155.         KsObjectTypeFilter,
  9156.         KsObjectTypePin
  9157.     } KSOBJECTTYPE;
  9158.  
  9159.     typedef
  9160.     void
  9161.     (*PFNKSFREE)(
  9162.         IN PVOID Data
  9163.         );
  9164.  
  9165.     typedef
  9166.     void
  9167.     (*PFNKSPINFRAMERETURN)(
  9168.         IN PKSPIN Pin,
  9169.         IN PVOID Data OPTIONAL,
  9170.         IN ULONG Size OPTIONAL,
  9171.         IN PMDL Mdl OPTIONAL,
  9172.         IN PVOID Context OPTIONAL,
  9173.         IN NTSTATUS Status
  9174.         );
  9175.  
  9176.     #if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
  9177.     #if !defined(_IKsControl_)
  9178.     #define _IKsControl_
  9179.  
  9180.     typedef interface IKsControl* PIKSCONTROL;
  9181.  
  9182.     #if !defined(DEFINE_ABSTRACT_UNKNOWN)
  9183.  
  9184.     #define DEFINE_ABSTRACT_UNKNOWN()                               \
  9185.         STDMETHOD_(NTSTATUS, QueryInterface)(THIS_                   \
  9186.             REFIID InterfaceId,                                     \
  9187.             PVOID* Interface                                        \
  9188.             ) PURE;                                                 \
  9189.         STDMETHOD_(ULONG,AddRef)(THIS) PURE;                        \
  9190.         STDMETHOD_(ULONG,Release)(THIS) PURE;
  9191.  
  9192.     #endif //!defined(DEFINE_ABSTRACT_UNKNOWN)
  9193.  
  9194.     #undef INTERFACE
  9195.     #define INTERFACE IKsControl
  9196.     DECLARE_INTERFACE_(IKsControl,IUnknown)
  9197.     {
  9198.         DEFINE_ABSTRACT_UNKNOWN() // For C
  9199.  
  9200.         STDMETHOD_(NTSTATUS, KsProperty)(THIS_
  9201.             IN PKSPROPERTY Property,
  9202.             IN ULONG PropertyLength,
  9203.             IN OUT PVOID PropertyData,
  9204.             IN ULONG DataLength,
  9205.             OUT ULONG* BytesReturned
  9206.             ) PURE;
  9207.         STDMETHOD_(NTSTATUS, KsMethod)(THIS_
  9208.             IN PKSMETHOD Method,
  9209.             IN ULONG MethodLength,
  9210.             IN OUT PVOID MethodData,
  9211.             IN ULONG DataLength,
  9212.             OUT ULONG* BytesReturned
  9213.             ) PURE;
  9214.         STDMETHOD_(NTSTATUS, KsEvent)(THIS_
  9215.             IN PKSEVENT Event OPTIONAL,
  9216.             IN ULONG EventLength,
  9217.             IN OUT PVOID EventData,
  9218.             IN ULONG DataLength,
  9219.             OUT ULONG* BytesReturned
  9220.             ) PURE;
  9221.     };
  9222.  
  9223.     typedef interface IKsReferenceClock* PIKSREFERENCECLOCK;
  9224.  
  9225.     #undef INTERFACE
  9226.     #define INTERFACE IKsReferenceClock
  9227.     DECLARE_INTERFACE_(IKsReferenceClock,IUnknown)
  9228.     {
  9229.         DEFINE_ABSTRACT_UNKNOWN() // For C
  9230.  
  9231.         STDMETHOD_(LONGLONG,GetTime)(THIS
  9232.             ) PURE;
  9233.         STDMETHOD_(LONGLONG,GetPhysicalTime)(THIS
  9234.             ) PURE;
  9235.         STDMETHOD_(LONGLONG,GetCorrelatedTime)(THIS_
  9236.             OUT PLONGLONG SystemTime
  9237.             ) PURE;
  9238.         STDMETHOD_(LONGLONG,GetCorrelatedPhysicalTime)(THIS_
  9239.             OUT PLONGLONG SystemTime
  9240.             ) PURE;
  9241.         STDMETHOD_(NTSTATUS, GetResolution)(THIS_
  9242.             OUT PKSRESOLUTION Resolution
  9243.             ) PURE;
  9244.         STDMETHOD_(NTSTATUS, GetState)(THIS_
  9245.             OUT PKSSTATE State
  9246.             ) PURE;
  9247.     };
  9248.     #undef INTERFACE
  9249.  
  9250.     #define STATIC_IID_IKsControl \
  9251.     0x28F54685L, 0x06FD, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  9252.     DEFINE_GUID(IID_IKsControl,
  9253.     0x28F54685L, 0x06FD, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96);
  9254.     #if defined(__cplusplus) && _MSC_VER >= 1100
  9255.     struct __declspec(uuid("28F54685-06FD-11D2-B27A-00A0C9223196")) IKsControl;
  9256.     #endif
  9257.  
  9258.     #define STATIC_IID_IKsFastClock \
  9259.     0xc9902485, 0xc180, 0x11d2, 0x84, 0x73, 0xd4, 0x23, 0x94, 0x45, 0x9e, 0x5e
  9260.     DEFINE_GUID(IID_IKsFastClock,
  9261.     0xc9902485, 0xc180, 0x11d2, 0x84, 0x73, 0xd4, 0x23, 0x94, 0x45, 0x9e, 0x5e);
  9262.     #if defined(__cplusplus) && _MSC_VER >= 1100
  9263.     struct __declspec(uuid("C9902485-C180-11d2-8473-D42394459E5E")) IKsFastClock;
  9264.     #endif
  9265.  
  9266.     #endif // !defined(_IKsControl_)
  9267.     #endif // defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
  9268.  
  9269.     #endif // defined(_NTDDK_)
  9270.  
  9271.     //===========================================================================
  9272.  
  9273.     #if defined(__cplusplus)
  9274.     extern "C" {
  9275.     #endif // defined(__cplusplus)
  9276.  
  9277.     //
  9278.     // exported prototypes
  9279.     //
  9280.  
  9281.     #ifdef _KSDDK_
  9282.     #define KSDDKAPI
  9283.     #else // !_KSDDK_
  9284.     #define KSDDKAPI DECLSPEC_IMPORT
  9285.     #endif // _KSDDK_
  9286.  
  9287.     #if defined(_NTDDK_)
  9288.  
  9289.     KSDDKAPI
  9290.     NTSTATUS
  9291.     NTAPI
  9292.     KsEnableEvent(
  9293.         IN PIRP Irp,
  9294.         IN ULONG EventSetsCount,
  9295.         IN const KSEVENT_SET* EventSet,
  9296.         IN OUT PLIST_ENTRY EventsList OPTIONAL,
  9297.         IN KSEVENTS_LOCKTYPE EventsFlags OPTIONAL,
  9298.         IN PVOID EventsLock OPTIONAL
  9299.         );
  9300.  
  9301.     KSDDKAPI
  9302.     NTSTATUS
  9303.     NTAPI
  9304.     KsEnableEventWithAllocator(
  9305.         IN PIRP Irp,
  9306.         IN ULONG EventSetsCount,
  9307.         IN const KSEVENT_SET* EventSet,
  9308.         IN OUT PLIST_ENTRY EventsList OPTIONAL,
  9309.         IN KSEVENTS_LOCKTYPE EventsFlags OPTIONAL,
  9310.         IN PVOID EventsLock OPTIONAL,
  9311.         IN PFNKSALLOCATOR Allocator OPTIONAL,
  9312.         IN ULONG EventItemSize OPTIONAL
  9313.         );
  9314.  
  9315.     KSDDKAPI
  9316.     NTSTATUS
  9317.     NTAPI
  9318.     KsDisableEvent(
  9319.         IN PIRP Irp,
  9320.         IN OUT PLIST_ENTRY EventsList,
  9321.         IN KSEVENTS_LOCKTYPE EventsFlags,
  9322.         IN PVOID EventsLock
  9323.         );
  9324.  
  9325.     KSDDKAPI
  9326.     VOID
  9327.     NTAPI
  9328.     KsDiscardEvent(
  9329.         IN PKSEVENT_ENTRY EventEntry
  9330.         );
  9331.  
  9332.     KSDDKAPI
  9333.     VOID
  9334.     NTAPI
  9335.     KsFreeEventList(
  9336.         IN PFILE_OBJECT FileObject,
  9337.         IN OUT PLIST_ENTRY EventsList,
  9338.         IN KSEVENTS_LOCKTYPE EventsFlags,
  9339.         IN PVOID EventsLock
  9340.         );
  9341.  
  9342.     KSDDKAPI
  9343.     NTSTATUS
  9344.     NTAPI
  9345.     KsGenerateEvent(
  9346.         IN PKSEVENT_ENTRY EventEntry
  9347.         );
  9348.  
  9349.     KSDDKAPI
  9350.     NTSTATUS
  9351.     NTAPI
  9352.     KsGenerateDataEvent(
  9353.         IN PKSEVENT_ENTRY EventEntry,
  9354.         IN ULONG DataSize,
  9355.         IN PVOID Data
  9356.         );
  9357.  
  9358.     KSDDKAPI
  9359.     VOID
  9360.     NTAPI
  9361.     KsGenerateEventList(
  9362.         IN GUID* Set OPTIONAL,
  9363.         IN ULONG EventId,
  9364.         IN PLIST_ENTRY EventsList,
  9365.         IN KSEVENTS_LOCKTYPE EventsFlags,
  9366.         IN PVOID EventsLock
  9367.         );
  9368.  
  9369.     // property.c:
  9370.  
  9371.     KSDDKAPI
  9372.     NTSTATUS
  9373.     NTAPI
  9374.     KsPropertyHandler(
  9375.         IN PIRP Irp,
  9376.         IN ULONG PropertySetsCount,
  9377.         IN const KSPROPERTY_SET* PropertySet
  9378.         );
  9379.  
  9380.     KSDDKAPI
  9381.     NTSTATUS
  9382.     NTAPI
  9383.     KsPropertyHandlerWithAllocator(
  9384.         IN PIRP Irp,
  9385.         IN ULONG PropertySetsCount,
  9386.         IN const KSPROPERTY_SET* PropertySet,
  9387.         IN PFNKSALLOCATOR Allocator OPTIONAL,
  9388.         IN ULONG PropertyItemSize OPTIONAL
  9389.         );
  9390.  
  9391.     KSDDKAPI
  9392.     BOOLEAN
  9393.     NTAPI
  9394.     KsFastPropertyHandler(
  9395.         IN PFILE_OBJECT FileObject,
  9396.         IN PKSPROPERTY UNALIGNED Property,
  9397.         IN ULONG PropertyLength,
  9398.         IN OUT PVOID UNALIGNED Data,
  9399.         IN ULONG DataLength,
  9400.         OUT PIO_STATUS_BLOCK IoStatus,
  9401.         IN ULONG PropertySetsCount,
  9402.         IN const KSPROPERTY_SET* PropertySet
  9403.         );
  9404.  
  9405.     // method.c:
  9406.  
  9407.     KSDDKAPI
  9408.     NTSTATUS
  9409.     NTAPI
  9410.     KsMethodHandler(
  9411.         IN PIRP Irp,
  9412.         IN ULONG MethodSetsCount,
  9413.         IN const KSMETHOD_SET* MethodSet
  9414.         );
  9415.  
  9416.     KSDDKAPI
  9417.     NTSTATUS
  9418.     NTAPI
  9419.     KsMethodHandlerWithAllocator(
  9420.         IN PIRP Irp,
  9421.         IN ULONG MethodSetsCount,
  9422.         IN const KSMETHOD_SET* MethodSet,
  9423.         IN PFNKSALLOCATOR Allocator OPTIONAL,
  9424.         IN ULONG MethodItemSize OPTIONAL
  9425.         );
  9426.  
  9427.     KSDDKAPI
  9428.     BOOLEAN
  9429.     NTAPI
  9430.     KsFastMethodHandler(
  9431.         IN PFILE_OBJECT FileObject,
  9432.         IN PKSMETHOD UNALIGNED Method,
  9433.         IN ULONG MethodLength,
  9434.         IN OUT PVOID UNALIGNED Data,
  9435.         IN ULONG DataLength,
  9436.         OUT PIO_STATUS_BLOCK IoStatus,
  9437.         IN ULONG MethodSetsCount,
  9438.         IN const KSMETHOD_SET* MethodSet
  9439.         );
  9440.  
  9441.     // alloc.c:
  9442.  
  9443.     KSDDKAPI
  9444.     NTSTATUS
  9445.     NTAPI
  9446.     KsCreateDefaultAllocator(
  9447.         IN PIRP Irp
  9448.         );
  9449.  
  9450.     KSDDKAPI
  9451.     NTSTATUS
  9452.     NTAPI
  9453.     KsCreateDefaultAllocatorEx(
  9454.         IN PIRP Irp,
  9455.         IN PVOID InitializeContext OPTIONAL,
  9456.         IN PFNKSDEFAULTALLOCATE DefaultAllocate OPTIONAL,
  9457.         IN PFNKSDEFAULTFREE DefaultFree OPTIONAL,
  9458.         IN PFNKSINITIALIZEALLOCATOR InitializeAllocator OPTIONAL,
  9459.         IN PFNKSDELETEALLOCATOR DeleteAllocator OPTIONAL
  9460.         );
  9461.  
  9462.     KSDDKAPI
  9463.     NTSTATUS
  9464.     NTAPI
  9465.     KsCreateAllocator(
  9466.         IN HANDLE ConnectionHandle,
  9467.         IN PKSALLOCATOR_FRAMING AllocatorFraming,
  9468.         OUT PHANDLE AllocatorHandle
  9469.         );
  9470.  
  9471.     KSDDKAPI
  9472.     NTSTATUS
  9473.     NTAPI
  9474.     KsValidateAllocatorCreateRequest(
  9475.         IN PIRP Irp,
  9476.         OUT PKSALLOCATOR_FRAMING* AllocatorFraming
  9477.         );
  9478.  
  9479.     KSDDKAPI
  9480.     NTSTATUS
  9481.     NTAPI
  9482.     KsValidateAllocatorFramingEx(
  9483.         IN PKSALLOCATOR_FRAMING_EX Framing,
  9484.         IN ULONG BufferSize,
  9485.         IN const KSALLOCATOR_FRAMING_EX *PinFraming
  9486.         );
  9487.  
  9488.     // clock.c:
  9489.  
  9490.     KSDDKAPI
  9491.     NTSTATUS
  9492.     NTAPI
  9493.     KsAllocateDefaultClock(
  9494.         OUT PKSDEFAULTCLOCK* DefaultClock
  9495.         );
  9496.  
  9497.     KSDDKAPI
  9498.     NTSTATUS
  9499.     NTAPI
  9500.     KsAllocateDefaultClockEx(
  9501.         OUT PKSDEFAULTCLOCK* DefaultClock,
  9502.         IN PVOID Context OPTIONAL,
  9503.         IN PFNKSSETTIMER SetTimer OPTIONAL,
  9504.         IN PFNKSCANCELTIMER CancelTimer OPTIONAL,
  9505.         IN PFNKSCORRELATEDTIME CorrelatedTime OPTIONAL,
  9506.         IN const KSRESOLUTION* Resolution OPTIONAL,
  9507.         IN ULONG Flags
  9508.         );
  9509.  
  9510.     KSDDKAPI
  9511.     VOID
  9512.     NTAPI
  9513.     KsFreeDefaultClock(
  9514.         IN PKSDEFAULTCLOCK DefaultClock
  9515.         );
  9516.  
  9517.     KSDDKAPI
  9518.     NTSTATUS
  9519.     NTAPI
  9520.     KsCreateDefaultClock(
  9521.         IN PIRP Irp,
  9522.         IN PKSDEFAULTCLOCK DefaultClock
  9523.         );
  9524.  
  9525.     KSDDKAPI
  9526.     NTSTATUS
  9527.     NTAPI
  9528.     KsCreateClock(
  9529.         IN HANDLE ConnectionHandle,
  9530.         IN PKSCLOCK_CREATE ClockCreate,
  9531.         OUT PHANDLE ClockHandle
  9532.         );
  9533.  
  9534.     KSDDKAPI
  9535.     NTSTATUS
  9536.     NTAPI
  9537.     KsValidateClockCreateRequest(
  9538.         IN PIRP Irp,
  9539.         OUT PKSCLOCK_CREATE* ClockCreate
  9540.         );
  9541.  
  9542.     KSDDKAPI
  9543.     KSSTATE
  9544.     NTAPI
  9545.     KsGetDefaultClockState(
  9546.         IN PKSDEFAULTCLOCK DefaultClock
  9547.         );
  9548.  
  9549.     KSDDKAPI
  9550.     VOID
  9551.     NTAPI
  9552.     KsSetDefaultClockState(
  9553.         IN PKSDEFAULTCLOCK DefaultClock,
  9554.         IN KSSTATE State
  9555.         );
  9556.  
  9557.     KSDDKAPI
  9558.     LONGLONG
  9559.     NTAPI
  9560.     KsGetDefaultClockTime(
  9561.         IN PKSDEFAULTCLOCK DefaultClock
  9562.         );
  9563.  
  9564.     KSDDKAPI
  9565.     VOID
  9566.     NTAPI
  9567.     KsSetDefaultClockTime(
  9568.         IN PKSDEFAULTCLOCK DefaultClock,
  9569.         IN LONGLONG Time
  9570.         );
  9571.  
  9572.     // connect.c:
  9573.  
  9574.     KSDDKAPI
  9575.     NTSTATUS
  9576.     NTAPI
  9577.     KsCreatePin(
  9578.         IN HANDLE FilterHandle,
  9579.         IN PKSPIN_CONNECT Connect,
  9580.         IN ACCESS_MASK DesiredAccess,
  9581.         OUT PHANDLE ConnectionHandle
  9582.         );
  9583.  
  9584.     KSDDKAPI
  9585.     NTSTATUS
  9586.     NTAPI
  9587.     KsValidateConnectRequest(
  9588.         IN PIRP Irp,
  9589.         IN ULONG DescriptorsCount,
  9590.         IN const KSPIN_DESCRIPTOR* Descriptor,
  9591.         OUT PKSPIN_CONNECT* Connect
  9592.         );
  9593.  
  9594.     KSDDKAPI
  9595.     NTSTATUS
  9596.     NTAPI
  9597.     KsPinPropertyHandler(
  9598.         IN PIRP Irp,
  9599.         IN PKSPROPERTY Property,
  9600.         IN OUT PVOID Data,
  9601.         IN ULONG DescriptorsCount,
  9602.         IN const KSPIN_DESCRIPTOR* Descriptor
  9603.         );
  9604.  
  9605.     KSDDKAPI
  9606.     NTSTATUS
  9607.     NTAPI
  9608.     KsPinDataIntersection(
  9609.         IN PIRP Irp,
  9610.         IN PKSP_PIN Pin,
  9611.         OUT PVOID Data OPTIONAL,
  9612.         IN ULONG DescriptorsCount,
  9613.         IN const KSPIN_DESCRIPTOR* Descriptor,
  9614.         IN PFNKSINTERSECTHANDLER IntersectHandler
  9615.         );
  9616.  
  9617.     KSDDKAPI
  9618.     NTSTATUS
  9619.     NTAPI
  9620.     KsPinDataIntersectionEx(
  9621.         IN PIRP Irp,
  9622.         IN PKSP_PIN Pin,
  9623.         OUT PVOID Data,
  9624.         IN ULONG DescriptorsCount,
  9625.         IN const KSPIN_DESCRIPTOR* Descriptor,
  9626.         IN ULONG DescriptorSize,
  9627.         IN PFNKSINTERSECTHANDLEREX IntersectHandler OPTIONAL,
  9628.         IN PVOID HandlerContext OPTIONAL
  9629.         );
  9630.  
  9631.     KSDDKAPI
  9632.     NTSTATUS
  9633.     NTAPI
  9634.     KsHandleSizedListQuery(
  9635.         IN PIRP Irp,
  9636.         IN ULONG DataItemsCount,
  9637.         IN ULONG DataItemSize,
  9638.         IN const VOID* DataItems
  9639.         );
  9640.  
  9641.     // image.c:
  9642.  
  9643.     #if (!defined( MAKEINTRESOURCE )) 
  9644.     #define MAKEINTRESOURCE( res ) ((ULONG_PTR) (USHORT) res)
  9645.     #endif
  9646.  
  9647.     #if (!defined( RT_STRING ))
  9648.     #define RT_STRING           MAKEINTRESOURCE( 6 )
  9649.     #define RT_RCDATA           MAKEINTRESOURCE( 10 ) 
  9650.     #endif
  9651.  
  9652.     KSDDKAPI
  9653.     NTSTATUS
  9654.     NTAPI
  9655.     KsLoadResource(
  9656.         IN PVOID ImageBase,
  9657.         IN POOL_TYPE PoolType,
  9658.         IN ULONG_PTR ResourceName,
  9659.         IN ULONG ResourceType,
  9660.         OUT PVOID *Resource,
  9661.         OUT PULONG ResourceSize            
  9662.         );
  9663.     
  9664.     KSDDKAPI
  9665.     NTSTATUS
  9666.     NTAPI
  9667.     KsGetImageNameAndResourceId(
  9668.         IN HANDLE RegKey,
  9669.         OUT PUNICODE_STRING ImageName,                
  9670.         OUT PULONG_PTR ResourceId,
  9671.         OUT PULONG ValueType
  9672.     );
  9673.  
  9674.     KSDDKAPI
  9675.     NTSTATUS
  9676.     NTAPI
  9677.     KsMapModuleName(
  9678.         IN PDEVICE_OBJECT PhysicalDeviceObject,
  9679.         IN PUNICODE_STRING ModuleName,
  9680.         OUT PUNICODE_STRING ImageName,                
  9681.         OUT PULONG_PTR ResourceId,
  9682.         OUT PULONG ValueType
  9683.         );
  9684.     
  9685.     // irp.c:
  9686.  
  9687.     KSDDKAPI
  9688.     NTSTATUS
  9689.     NTAPI
  9690.     KsReferenceBusObject(
  9691.         IN KSDEVICE_HEADER  Header
  9692.         );
  9693.  
  9694.     KSDDKAPI
  9695.     VOID
  9696.     NTAPI
  9697.     KsDereferenceBusObject(
  9698.         IN KSDEVICE_HEADER  Header
  9699.         );
  9700.  
  9701.     KSDDKAPI
  9702.     NTSTATUS
  9703.     NTAPI
  9704.     KsDispatchQuerySecurity(
  9705.         IN PDEVICE_OBJECT DeviceObject,
  9706.         IN PIRP Irp
  9707.         );
  9708.  
  9709.     KSDDKAPI
  9710.     NTSTATUS
  9711.     NTAPI
  9712.     KsDispatchSetSecurity(
  9713.         IN PDEVICE_OBJECT DeviceObject,
  9714.         IN PIRP Irp
  9715.         );
  9716.  
  9717.     KSDDKAPI
  9718.     NTSTATUS
  9719.     NTAPI
  9720.     KsDispatchSpecificProperty(
  9721.         IN PIRP Irp,
  9722.         IN PFNKSHANDLER Handler
  9723.         );
  9724.  
  9725.     KSDDKAPI
  9726.     NTSTATUS
  9727.     NTAPI
  9728.     KsDispatchSpecificMethod(
  9729.         IN PIRP Irp,
  9730.         IN PFNKSHANDLER Handler
  9731.         );
  9732.  
  9733.     KSDDKAPI
  9734.     NTSTATUS
  9735.     NTAPI
  9736.     KsReadFile(
  9737.         IN PFILE_OBJECT FileObject,
  9738.         IN PKEVENT Event OPTIONAL,
  9739.         IN PVOID PortContext OPTIONAL,
  9740.         OUT PIO_STATUS_BLOCK IoStatusBlock,
  9741.         OUT PVOID Buffer,
  9742.         IN ULONG Length,
  9743.         IN ULONG Key OPTIONAL,
  9744.         IN KPROCESSOR_MODE RequestorMode
  9745.         );
  9746.  
  9747.     KSDDKAPI
  9748.     NTSTATUS
  9749.     NTAPI
  9750.     KsWriteFile(
  9751.         IN PFILE_OBJECT FileObject,
  9752.         IN PKEVENT Event OPTIONAL,
  9753.         IN PVOID PortContext OPTIONAL,
  9754.         OUT PIO_STATUS_BLOCK IoStatusBlock,
  9755.         IN PVOID Buffer,
  9756.         IN ULONG Length,
  9757.         IN ULONG Key OPTIONAL,
  9758.         IN KPROCESSOR_MODE RequestorMode
  9759.         );
  9760.  
  9761.     KSDDKAPI
  9762.     NTSTATUS
  9763.     NTAPI
  9764.     KsQueryInformationFile(
  9765.         IN PFILE_OBJECT FileObject,
  9766.         OUT PVOID FileInformation,
  9767.         IN ULONG Length,
  9768.         IN FILE_INFORMATION_CLASS FileInformationClass
  9769.         );
  9770.  
  9771.     KSDDKAPI
  9772.     NTSTATUS
  9773.     NTAPI
  9774.     KsSetInformationFile(
  9775.         IN PFILE_OBJECT FileObject,
  9776.         IN PVOID FileInformation,
  9777.         IN ULONG Length,
  9778.         IN FILE_INFORMATION_CLASS FileInformationClass
  9779.         );
  9780.  
  9781.     KSDDKAPI
  9782.     NTSTATUS
  9783.     NTAPI
  9784.     KsStreamIo(
  9785.         IN PFILE_OBJECT FileObject,
  9786.         IN PKEVENT Event OPTIONAL,
  9787.         IN PVOID PortContext OPTIONAL,
  9788.         IN PIO_COMPLETION_ROUTINE CompletionRoutine OPTIONAL,
  9789.         IN PVOID CompletionContext OPTIONAL,
  9790.         IN KSCOMPLETION_INVOCATION CompletionInvocationFlags OPTIONAL,
  9791.         OUT PIO_STATUS_BLOCK IoStatusBlock,
  9792.         IN OUT PVOID StreamHeaders,
  9793.         IN ULONG Length,
  9794.         IN ULONG Flags,
  9795.         IN KPROCESSOR_MODE RequestorMode
  9796.         );
  9797.  
  9798.     KSDDKAPI
  9799.     NTSTATUS
  9800.     NTAPI
  9801.     KsProbeStreamIrp(
  9802.         IN OUT PIRP Irp,
  9803.         IN ULONG ProbeFlags,
  9804.         IN ULONG HeaderSize OPTIONAL
  9805.         );
  9806.  
  9807.     KSDDKAPI
  9808.     NTSTATUS
  9809.     NTAPI
  9810.     KsAllocateExtraData(
  9811.         IN OUT PIRP Irp,
  9812.         IN ULONG ExtraSize,
  9813.         OUT PVOID* ExtraBuffer
  9814.         );
  9815.  
  9816.     KSDDKAPI
  9817.     VOID
  9818.     NTAPI
  9819.     KsNullDriverUnload(
  9820.         IN PDRIVER_OBJECT DriverObject
  9821.         );
  9822.  
  9823.     KSDDKAPI
  9824.     NTSTATUS
  9825.     NTAPI
  9826.     KsSetMajorFunctionHandler(
  9827.         IN PDRIVER_OBJECT DriverObject,
  9828.         IN ULONG MajorFunction
  9829.         );
  9830.  
  9831.     KSDDKAPI
  9832.     NTSTATUS
  9833.     NTAPI
  9834.     KsDispatchInvalidDeviceRequest(
  9835.         IN PDEVICE_OBJECT DeviceObject,
  9836.         IN PIRP Irp
  9837.         );
  9838.  
  9839.     KSDDKAPI
  9840.     NTSTATUS
  9841.     NTAPI
  9842.     KsDefaultDeviceIoCompletion(
  9843.         IN PDEVICE_OBJECT DeviceObject,
  9844.         IN PIRP Irp
  9845.         );
  9846.  
  9847.     KSDDKAPI
  9848.     NTSTATUS
  9849.     NTAPI
  9850.     KsDispatchIrp(
  9851.         IN PDEVICE_OBJECT DeviceObject,
  9852.         IN PIRP Irp
  9853.         );
  9854.  
  9855.     KSDDKAPI
  9856.     BOOLEAN
  9857.     NTAPI
  9858.     KsDispatchFastIoDeviceControlFailure(
  9859.         IN PFILE_OBJECT FileObject,
  9860.         IN BOOLEAN Wait,
  9861.         IN PVOID InputBuffer OPTIONAL,
  9862.         IN ULONG InputBufferLength,
  9863.         OUT PVOID OutputBuffer OPTIONAL,
  9864.         IN ULONG OutputBufferLength,
  9865.         IN ULONG IoControlCode,
  9866.         OUT PIO_STATUS_BLOCK IoStatus,
  9867.         IN PDEVICE_OBJECT DeviceObject
  9868.         );
  9869.  
  9870.     KSDDKAPI
  9871.     BOOLEAN
  9872.     NTAPI
  9873.     KsDispatchFastReadFailure(
  9874.         IN PFILE_OBJECT FileObject,
  9875.         IN PLARGE_INTEGER FileOffset,
  9876.         IN ULONG Length,
  9877.         IN BOOLEAN Wait,
  9878.         IN ULONG LockKey,
  9879.         OUT PVOID Buffer,
  9880.         OUT PIO_STATUS_BLOCK IoStatus,
  9881.         IN PDEVICE_OBJECT DeviceObject
  9882.         );
  9883.  
  9884.     #define KsDispatchFastWriteFailure KsDispatchFastReadFailure
  9885.  
  9886.     KSDDKAPI
  9887.     VOID
  9888.     NTAPI
  9889.     KsCancelRoutine(
  9890.         IN PDEVICE_OBJECT DeviceObject,
  9891.         IN PIRP Irp
  9892.         );
  9893.  
  9894.     KSDDKAPI
  9895.     VOID
  9896.     NTAPI
  9897.     KsCancelIo(   
  9898.         IN OUT PLIST_ENTRY  QueueHead,
  9899.         IN PKSPIN_LOCK SpinLock
  9900.         );
  9901.  
  9902.     KSDDKAPI
  9903.     VOID
  9904.     NTAPI
  9905.     KsReleaseIrpOnCancelableQueue(
  9906.         IN PIRP Irp,
  9907.         IN PDRIVER_CANCEL DriverCancel OPTIONAL
  9908.         );
  9909.  
  9910.     KSDDKAPI
  9911.     PIRP
  9912.     NTAPI
  9913.     KsRemoveIrpFromCancelableQueue(
  9914.         IN OUT PLIST_ENTRY QueueHead,
  9915.         IN PKSPIN_LOCK SpinLock,
  9916.         IN KSLIST_ENTRY_LOCATION ListLocation,
  9917.         IN KSIRP_REMOVAL_OPERATION RemovalOperation
  9918.         );
  9919.  
  9920.     KSDDKAPI
  9921.     NTSTATUS
  9922.     NTAPI
  9923.     KsMoveIrpsOnCancelableQueue(
  9924.         IN OUT PLIST_ENTRY SourceList,
  9925.         IN PKSPIN_LOCK SourceLock,
  9926.         IN OUT PLIST_ENTRY DestinationList,
  9927.         IN PKSPIN_LOCK DestinationLock OPTIONAL,
  9928.         IN KSLIST_ENTRY_LOCATION ListLocation,
  9929.         IN PFNKSIRPLISTCALLBACK ListCallback,
  9930.         IN PVOID Context
  9931.         );
  9932.  
  9933.     KSDDKAPI
  9934.     VOID
  9935.     NTAPI
  9936.     KsRemoveSpecificIrpFromCancelableQueue(
  9937.         IN PIRP Irp
  9938.         );
  9939.  
  9940.     KSDDKAPI
  9941.     VOID
  9942.     NTAPI
  9943.     KsAddIrpToCancelableQueue(
  9944.         IN OUT PLIST_ENTRY QueueHead,
  9945.         IN PKSPIN_LOCK SpinLock,
  9946.         IN PIRP Irp,
  9947.         IN KSLIST_ENTRY_LOCATION ListLocation,
  9948.         IN PDRIVER_CANCEL DriverCancel OPTIONAL
  9949.         );
  9950.  
  9951.     // api.c:
  9952.  
  9953.     KSDDKAPI
  9954.     NTSTATUS
  9955.     NTAPI
  9956.     KsAcquireResetValue(
  9957.         IN PIRP Irp,
  9958.         OUT KSRESET* ResetValue
  9959.         );
  9960.  
  9961.     KSDDKAPI
  9962.     NTSTATUS
  9963.     NTAPI
  9964.     KsTopologyPropertyHandler(
  9965.         IN PIRP Irp,
  9966.         IN PKSPROPERTY Property,
  9967.         IN OUT PVOID Data,
  9968.         IN const KSTOPOLOGY* Topology
  9969.         );
  9970.  
  9971.     KSDDKAPI
  9972.     VOID
  9973.     NTAPI
  9974.     KsAcquireDeviceSecurityLock(
  9975.         IN KSDEVICE_HEADER Header,
  9976.         IN BOOLEAN Exclusive
  9977.         );
  9978.  
  9979.     KSDDKAPI
  9980.     VOID
  9981.     NTAPI
  9982.     KsReleaseDeviceSecurityLock(
  9983.         IN KSDEVICE_HEADER Header
  9984.         );
  9985.     
  9986.     KSDDKAPI
  9987.     NTSTATUS
  9988.     NTAPI
  9989.     KsDefaultDispatchPnp(
  9990.         IN PDEVICE_OBJECT DeviceObject,
  9991.         IN PIRP Irp
  9992.         );
  9993.  
  9994.     KSDDKAPI
  9995.     NTSTATUS
  9996.     NTAPI
  9997.     KsDefaultDispatchPower(
  9998.         IN PDEVICE_OBJECT DeviceObject,
  9999.         IN PIRP Irp
  10000.         );
  10001.     
  10002.     KSDDKAPI
  10003.     NTSTATUS
  10004.     NTAPI
  10005.     KsDefaultForwardIrp(
  10006.         IN PDEVICE_OBJECT DeviceObject,
  10007.         IN PIRP Irp
  10008.         );
  10009.  
  10010.     KSDDKAPI
  10011.     VOID
  10012.     NTAPI
  10013.     KsSetDevicePnpAndBaseObject(
  10014.         IN KSDEVICE_HEADER Header,
  10015.         IN PDEVICE_OBJECT PnpDeviceObject,
  10016.         IN PDEVICE_OBJECT BaseObject
  10017.         );
  10018.  
  10019.     KSDDKAPI
  10020.     PDEVICE_OBJECT
  10021.     NTAPI
  10022.     KsQueryDevicePnpObject(
  10023.         IN KSDEVICE_HEADER Header
  10024.         );
  10025.  
  10026.     KSDDKAPI
  10027.     ACCESS_MASK
  10028.     NTAPI
  10029.     KsQueryObjectAccessMask(
  10030.         IN KSOBJECT_HEADER Header
  10031.         );
  10032.  
  10033.     KSDDKAPI
  10034.     VOID
  10035.     NTAPI
  10036.     KsRecalculateStackDepth(
  10037.         IN KSDEVICE_HEADER Header,
  10038.         IN BOOLEAN ReuseStackLocation
  10039.         );
  10040.  
  10041.     KSDDKAPI
  10042.     VOID
  10043.     NTAPI
  10044.     KsSetTargetState(
  10045.         IN KSOBJECT_HEADER Header,
  10046.         IN KSTARGET_STATE TargetState
  10047.         );
  10048.  
  10049.     KSDDKAPI
  10050.     VOID
  10051.     NTAPI
  10052.     KsSetTargetDeviceObject(
  10053.         IN KSOBJECT_HEADER Header,
  10054.         IN PDEVICE_OBJECT TargetDevice OPTIONAL
  10055.         );
  10056.  
  10057.     KSDDKAPI
  10058.     VOID
  10059.     NTAPI
  10060.     KsSetPowerDispatch(
  10061.         IN KSOBJECT_HEADER Header,
  10062.         IN PFNKSCONTEXT_DISPATCH PowerDispatch OPTIONAL,
  10063.         IN PVOID PowerContext OPTIONAL
  10064.         );
  10065.  
  10066.     KSDDKAPI
  10067.     PKSOBJECT_CREATE_ITEM
  10068.     NTAPI
  10069.     KsQueryObjectCreateItem(
  10070.         IN KSOBJECT_HEADER Header
  10071.         );
  10072.  
  10073.     KSDDKAPI
  10074.     NTSTATUS
  10075.     NTAPI
  10076.     KsAllocateDeviceHeader(
  10077.         OUT KSDEVICE_HEADER* Header,
  10078.         IN ULONG ItemsCount,
  10079.         IN PKSOBJECT_CREATE_ITEM ItemsList OPTIONAL
  10080.         );
  10081.  
  10082.     KSDDKAPI
  10083.     VOID
  10084.     NTAPI
  10085.     KsFreeDeviceHeader(
  10086.         IN KSDEVICE_HEADER Header
  10087.         );
  10088.  
  10089.     KSDDKAPI
  10090.     NTSTATUS
  10091.     NTAPI
  10092.     KsAllocateObjectHeader(
  10093.         OUT KSOBJECT_HEADER* Header,
  10094.         IN ULONG ItemsCount,
  10095.         IN PKSOBJECT_CREATE_ITEM ItemsList OPTIONAL,
  10096.         IN PIRP Irp,
  10097.         IN const KSDISPATCH_TABLE* Table
  10098.         );
  10099.  
  10100.     KSDDKAPI
  10101.     VOID
  10102.     NTAPI
  10103.     KsFreeObjectHeader(
  10104.         IN KSOBJECT_HEADER Header
  10105.         );
  10106.  
  10107.     KSDDKAPI
  10108.     NTSTATUS
  10109.     NTAPI
  10110.     KsAddObjectCreateItemToDeviceHeader(
  10111.         IN KSDEVICE_HEADER Header,
  10112.         IN PDRIVER_DISPATCH Create,
  10113.         IN PVOID Context,
  10114.         IN PWCHAR ObjectClass,
  10115.         IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL
  10116.         );
  10117.  
  10118.     KSDDKAPI
  10119.     NTSTATUS
  10120.     NTAPI
  10121.     KsAddObjectCreateItemToObjectHeader(
  10122.         IN KSOBJECT_HEADER Header,
  10123.         IN PDRIVER_DISPATCH Create,
  10124.         IN PVOID Context,
  10125.         IN PWCHAR ObjectClass,
  10126.         IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL
  10127.         );
  10128.  
  10129.     KSDDKAPI
  10130.     NTSTATUS
  10131.     NTAPI
  10132.     KsAllocateObjectCreateItem(
  10133.         IN KSDEVICE_HEADER Header,
  10134.         IN PKSOBJECT_CREATE_ITEM CreateItem,
  10135.         IN BOOLEAN AllocateEntry,
  10136.         IN PFNKSITEMFREECALLBACK ItemFreeCallback OPTIONAL
  10137.         );
  10138.  
  10139.     KSDDKAPI
  10140.     NTSTATUS
  10141.     NTAPI
  10142.     KsFreeObjectCreateItem(
  10143.         IN KSDEVICE_HEADER Header,
  10144.         IN PUNICODE_STRING CreateItem
  10145.         );
  10146.  
  10147.     KSDDKAPI
  10148.     NTSTATUS
  10149.     NTAPI
  10150.     KsFreeObjectCreateItemsByContext(
  10151.         IN KSDEVICE_HEADER Header,
  10152.         IN PVOID Context
  10153.         );
  10154.  
  10155.     KSDDKAPI
  10156.     NTSTATUS
  10157.     NTAPI
  10158.     KsCreateDefaultSecurity(
  10159.         IN PSECURITY_DESCRIPTOR ParentSecurity OPTIONAL,
  10160.         OUT PSECURITY_DESCRIPTOR* DefaultSecurity
  10161.         );
  10162.  
  10163.     KSDDKAPI
  10164.     NTSTATUS
  10165.     NTAPI
  10166.     KsForwardIrp(
  10167.         IN PIRP Irp,
  10168.         IN PFILE_OBJECT FileObject,
  10169.         IN BOOLEAN ReuseStackLocation
  10170.         );
  10171.  
  10172.     KSDDKAPI
  10173.     NTSTATUS
  10174.     NTAPI
  10175.     KsForwardAndCatchIrp(
  10176.         IN PDEVICE_OBJECT DeviceObject,
  10177.         IN PIRP Irp,
  10178.         IN PFILE_OBJECT FileObject,
  10179.         IN KSSTACK_USE StackUse
  10180.         );
  10181.  
  10182.     KSDDKAPI
  10183.     NTSTATUS
  10184.     NTAPI
  10185.     KsSynchronousIoControlDevice(
  10186.         IN PFILE_OBJECT FileObject,
  10187.         IN KPROCESSOR_MODE RequestorMode,
  10188.         IN ULONG IoControl,
  10189.         IN PVOID InBuffer,
  10190.         IN ULONG InSize,
  10191.         OUT PVOID OutBuffer,
  10192.         IN ULONG OutSize,
  10193.         OUT PULONG BytesReturned
  10194.         );
  10195.  
  10196.     KSDDKAPI
  10197.     NTSTATUS
  10198.     NTAPI
  10199.     KsUnserializeObjectPropertiesFromRegistry(
  10200.         IN PFILE_OBJECT FileObject,
  10201.         IN HANDLE ParentKey OPTIONAL,
  10202.         IN PUNICODE_STRING RegistryPath OPTIONAL
  10203.         );
  10204.  
  10205.     KSDDKAPI
  10206.     NTSTATUS
  10207.     NTAPI
  10208.     KsCacheMedium(
  10209.         IN PUNICODE_STRING SymbolicLink,
  10210.         IN PKSPIN_MEDIUM Medium,
  10211.         IN ULONG PinDirection
  10212.         );
  10213.  
  10214.     // thread.c:
  10215.  
  10216.     KSDDKAPI
  10217.     NTSTATUS
  10218.     NTAPI
  10219.     KsRegisterWorker(
  10220.         IN WORK_QUEUE_TYPE WorkQueueType,
  10221.         OUT PKSWORKER* Worker
  10222.         );
  10223.     KSDDKAPI
  10224.     NTSTATUS
  10225.     NTAPI
  10226.     KsRegisterCountedWorker(
  10227.         IN WORK_QUEUE_TYPE WorkQueueType,
  10228.         IN PWORK_QUEUE_ITEM CountedWorkItem,
  10229.         OUT PKSWORKER* Worker
  10230.         );
  10231.     KSDDKAPI
  10232.     VOID
  10233.     NTAPI
  10234.     KsUnregisterWorker(
  10235.         IN PKSWORKER Worker
  10236.         );
  10237.     KSDDKAPI
  10238.     NTSTATUS
  10239.     NTAPI
  10240.     KsQueueWorkItem(
  10241.         IN PKSWORKER Worker,
  10242.         IN PWORK_QUEUE_ITEM WorkItem
  10243.         );
  10244.     KSDDKAPI
  10245.     ULONG
  10246.     NTAPI
  10247.     KsIncrementCountedWorker(
  10248.         IN PKSWORKER Worker
  10249.         );
  10250.     KSDDKAPI
  10251.     ULONG
  10252.     NTAPI
  10253.     KsDecrementCountedWorker(
  10254.         IN PKSWORKER Worker
  10255.         );
  10256.  
  10257.     // topology.c:
  10258.  
  10259.     KSDDKAPI
  10260.     NTSTATUS
  10261.     NTAPI
  10262.     KsCreateTopologyNode(
  10263.         IN HANDLE ParentHandle,
  10264.         IN PKSNODE_CREATE NodeCreate,
  10265.         IN ACCESS_MASK DesiredAccess,
  10266.         OUT PHANDLE NodeHandle
  10267.         );
  10268.  
  10269.     KSDDKAPI
  10270.     NTSTATUS
  10271.     NTAPI
  10272.     KsValidateTopologyNodeCreateRequest(
  10273.         IN PIRP Irp,
  10274.         IN PKSTOPOLOGY Topology,
  10275.         OUT PKSNODE_CREATE* NodeCreate
  10276.         );
  10277.  
  10278.     KSDDKAPI
  10279.     NTSTATUS
  10280.     NTAPI
  10281.     KsMergeAutomationTables(
  10282.         OUT PKSAUTOMATION_TABLE* AutomationTableAB,
  10283.         IN PKSAUTOMATION_TABLE AutomationTableA OPTIONAL,
  10284.         IN PKSAUTOMATION_TABLE AutomationTableB OPTIONAL,
  10285.         IN KSOBJECT_BAG Bag OPTIONAL
  10286.         );
  10287.  
  10288.     KSDDKAPI
  10289.     NTSTATUS
  10290.     NTAPI
  10291.     KsInitializeDriver(
  10292.         IN PDRIVER_OBJECT DriverObject,
  10293.         IN PUNICODE_STRING RegistryPathName,
  10294.         IN const KSDEVICE_DESCRIPTOR* Descriptor OPTIONAL
  10295.         );
  10296.  
  10297.     KSDDKAPI
  10298.     NTSTATUS
  10299.     NTAPI
  10300.     KsAddDevice(
  10301.         IN PDRIVER_OBJECT DriverObject,
  10302.         IN PDEVICE_OBJECT PhysicalDeviceObject
  10303.         );
  10304.  
  10305.     KSDDKAPI
  10306.     NTSTATUS
  10307.     NTAPI
  10308.     KsCreateDevice(
  10309.         IN PDRIVER_OBJECT DriverObject,
  10310.         IN PDEVICE_OBJECT PhysicalDeviceObject,
  10311.         IN const KSDEVICE_DESCRIPTOR* Descriptor OPTIONAL,
  10312.         IN ULONG ExtensionSize OPTIONAL,
  10313.         OUT PKSDEVICE* Device OPTIONAL
  10314.         );
  10315.  
  10316.     KSDDKAPI
  10317.     NTSTATUS
  10318.     NTAPI
  10319.     KsInitializeDevice(
  10320.         IN PDEVICE_OBJECT FunctionalDeviceObject,
  10321.         IN PDEVICE_OBJECT PhysicalDeviceObject,
  10322.         IN PDEVICE_OBJECT NextDeviceObject,
  10323.         IN const KSDEVICE_DESCRIPTOR* Descriptor OPTIONAL
  10324.         );
  10325.  
  10326.     KSDDKAPI
  10327.     void
  10328.     NTAPI
  10329.     KsTerminateDevice(
  10330.         IN PDEVICE_OBJECT DeviceObject
  10331.         );
  10332.  
  10333.     KSDDKAPI
  10334.     PKSDEVICE
  10335.     NTAPI
  10336.     KsGetDeviceForDeviceObject(
  10337.         IN PDEVICE_OBJECT FunctionalDeviceObject
  10338.         );
  10339.  
  10340.     KSDDKAPI
  10341.     void
  10342.     NTAPI
  10343.     KsAcquireDevice(
  10344.         IN PKSDEVICE Device
  10345.         );
  10346.  
  10347.     KSDDKAPI
  10348.     void
  10349.     NTAPI
  10350.     KsReleaseDevice(
  10351.         IN PKSDEVICE Device
  10352.         );
  10353.  
  10354.     KSDDKAPI
  10355.     void
  10356.     NTAPI
  10357.     KsDeviceRegisterAdapterObject(
  10358.         IN PKSDEVICE Device,
  10359.         IN PADAPTER_OBJECT AdapterObject,
  10360.         IN ULONG MaxMappingsByteCount,
  10361.         IN ULONG MappingTableStride
  10362.         );
  10363.  
  10364.     KSDDKAPI
  10365.     ULONG
  10366.     NTAPI
  10367.     KsDeviceGetBusData(
  10368.         IN PKSDEVICE Device,
  10369.         IN ULONG DataType,
  10370.         IN PVOID Buffer,
  10371.         IN ULONG Offset,
  10372.         IN ULONG Length
  10373.         );
  10374.  
  10375.     KSDDKAPI
  10376.     ULONG
  10377.     NTAPI
  10378.     KsDeviceSetBusData(
  10379.         IN PKSDEVICE Device,
  10380.         IN ULONG DataType,
  10381.         IN PVOID Buffer,
  10382.         IN ULONG Offset,
  10383.         IN ULONG Length
  10384.         );
  10385.  
  10386.     KSDDKAPI
  10387.     NTSTATUS
  10388.     NTAPI
  10389.     KsCreateFilterFactory(
  10390.         IN PDEVICE_OBJECT DeviceObject,
  10391.         IN const KSFILTER_DESCRIPTOR* Descriptor,
  10392.         IN PWCHAR RefString OPTIONAL,
  10393.         IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL,
  10394.         IN ULONG CreateItemFlags,
  10395.         IN PFNKSFILTERFACTORYPOWER SleepCallback OPTIONAL,
  10396.         IN PFNKSFILTERFACTORYPOWER WakeCallback OPTIONAL,
  10397.         OUT PKSFILTERFACTORY* FilterFactory OPTIONAL
  10398.         );
  10399.  
  10400.     #define KsDeleteFilterFactory(FilterFactory) \
  10401.         KsFreeObjectCreateItemsByContext(\
  10402.             *(KSDEVICE_HEADER *)(\
  10403.                 KsFilterFactoryGetParentDevice(FilterFactory)->FunctionalDeviceObject->\
  10404.                     DeviceExtension),\
  10405.             FilterFactory)
  10406.  
  10407.     KSDDKAPI
  10408.     NTSTATUS
  10409.     NTAPI
  10410.     KsFilterFactoryAddCreateItem(
  10411.         IN PKSFILTERFACTORY FilterFactory,
  10412.         IN PWCHAR RefString,
  10413.         IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL,
  10414.         IN ULONG CreateItemFlags
  10415.         );
  10416.  
  10417.     KSDDKAPI
  10418.     NTSTATUS
  10419.     NTAPI
  10420.     KsFilterFactorySetDeviceClassesState(
  10421.         IN PKSFILTERFACTORY FilterFactory,
  10422.         IN BOOLEAN NewState
  10423.         );
  10424.  
  10425.     KSDDKAPI
  10426.     PUNICODE_STRING
  10427.     NTAPI
  10428.     KsFilterFactoryGetSymbolicLink(
  10429.         IN PKSFILTERFACTORY FilterFactory
  10430.         );
  10431.  
  10432.     KSDDKAPI
  10433.     void
  10434.     NTAPI
  10435.     KsAddEvent(
  10436.         IN PVOID Object,
  10437.         IN PKSEVENT_ENTRY EventEntry
  10438.         );
  10439.  
  10440.     void _inline
  10441.     KsFilterAddEvent(
  10442.         IN PKSFILTER Filter,
  10443.         IN PKSEVENT_ENTRY EventEntry
  10444.         )
  10445.     {
  10446.         KsAddEvent(Filter,EventEntry);
  10447.     }
  10448.  
  10449.     void _inline
  10450.     KsPinAddEvent(
  10451.         IN PKSPIN Pin,
  10452.         IN PKSEVENT_ENTRY EventEntry
  10453.         )
  10454.     {
  10455.         KsAddEvent(Pin,EventEntry);
  10456.     }
  10457.  
  10458.     KSDDKAPI
  10459.     NTSTATUS    
  10460.     NTAPI
  10461.     KsDefaultAddEventHandler(
  10462.         IN PIRP Irp,
  10463.         IN PKSEVENTDATA EventData,
  10464.         IN OUT PKSEVENT_ENTRY EventEntry
  10465.         );
  10466.  
  10467.     KSDDKAPI
  10468.     void
  10469.     NTAPI
  10470.     KsGenerateEvents(
  10471.         IN PVOID Object,
  10472.         IN const GUID* EventSet OPTIONAL,
  10473.         IN ULONG EventId,
  10474.         IN ULONG DataSize,
  10475.         IN PVOID Data OPTIONAL,
  10476.         IN PFNKSGENERATEEVENTCALLBACK CallBack OPTIONAL,
  10477.         IN PVOID CallBackContext OPTIONAL
  10478.         );
  10479.  
  10480.     void _inline
  10481.     KsFilterGenerateEvents(
  10482.         IN PKSFILTER Filter,
  10483.         IN const GUID* EventSet OPTIONAL,
  10484.         IN ULONG EventId,
  10485.         IN ULONG DataSize,
  10486.         IN PVOID Data OPTIONAL,
  10487.         IN PFNKSGENERATEEVENTCALLBACK CallBack OPTIONAL,
  10488.         IN PVOID CallBackContext OPTIONAL
  10489.         )
  10490.     {
  10491.         KsGenerateEvents(
  10492.             Filter,
  10493.             EventSet,
  10494.             EventId,
  10495.             DataSize,
  10496.             Data,
  10497.             CallBack,
  10498.             CallBackContext);
  10499.     }
  10500.  
  10501.     void _inline
  10502.     KsPinGenerateEvents(
  10503.         IN PKSPIN Pin,
  10504.         IN const GUID* EventSet OPTIONAL,
  10505.         IN ULONG EventId,
  10506.         IN ULONG DataSize,
  10507.         IN PVOID Data OPTIONAL,
  10508.         IN PFNKSGENERATEEVENTCALLBACK CallBack OPTIONAL,
  10509.         IN PVOID CallBackContext OPTIONAL
  10510.         )
  10511.     {
  10512.         KsGenerateEvents(
  10513.             Pin,
  10514.             EventSet,
  10515.             EventId,
  10516.             DataSize,
  10517.             Data,
  10518.             CallBack,
  10519.             CallBackContext);
  10520.     }
  10521.  
  10522.     typedef enum {
  10523.         KSSTREAM_POINTER_STATE_UNLOCKED = 0,
  10524.         KSSTREAM_POINTER_STATE_LOCKED
  10525.     } KSSTREAM_POINTER_STATE;
  10526.  
  10527.     KSDDKAPI
  10528.     NTSTATUS
  10529.     NTAPI
  10530.     KsPinGetAvailableByteCount(
  10531.         IN PKSPIN Pin,
  10532.         OUT PLONG InputDataBytes OPTIONAL,
  10533.         OUT PLONG OutputBufferBytes OPTIONAL
  10534.         );
  10535.  
  10536.     KSDDKAPI
  10537.     PKSSTREAM_POINTER
  10538.     NTAPI
  10539.     KsPinGetLeadingEdgeStreamPointer(
  10540.         IN PKSPIN Pin,
  10541.         IN KSSTREAM_POINTER_STATE State
  10542.         );
  10543.  
  10544.     KSDDKAPI
  10545.     PKSSTREAM_POINTER
  10546.     NTAPI
  10547.     KsPinGetTrailingEdgeStreamPointer(
  10548.         IN PKSPIN Pin,
  10549.         IN KSSTREAM_POINTER_STATE State
  10550.         );
  10551.  
  10552.     KSDDKAPI
  10553.     NTSTATUS
  10554.     NTAPI
  10555.     KsStreamPointerLock(
  10556.         IN PKSSTREAM_POINTER StreamPointer
  10557.         );
  10558.  
  10559.     KSDDKAPI
  10560.     void
  10561.     NTAPI
  10562.     KsStreamPointerUnlock(
  10563.         IN PKSSTREAM_POINTER StreamPointer,
  10564.         IN BOOLEAN Eject
  10565.         );
  10566.  
  10567.     KSDDKAPI
  10568.     void
  10569.     NTAPI
  10570.     KsStreamPointerAdvanceOffsetsAndUnlock(
  10571.         IN PKSSTREAM_POINTER StreamPointer,
  10572.         IN ULONG InUsed,
  10573.         IN ULONG OutUsed,
  10574.         IN BOOLEAN Eject
  10575.         );
  10576.  
  10577.     KSDDKAPI
  10578.     void
  10579.     NTAPI
  10580.     KsStreamPointerDelete(
  10581.         IN PKSSTREAM_POINTER StreamPointer
  10582.         );
  10583.  
  10584.     KSDDKAPI
  10585.     NTSTATUS
  10586.     NTAPI
  10587.     KsStreamPointerClone(
  10588.         IN PKSSTREAM_POINTER StreamPointer,
  10589.         IN PFNKSSTREAMPOINTER CancelCallback OPTIONAL,
  10590.         IN ULONG ContextSize,
  10591.         OUT PKSSTREAM_POINTER* CloneStreamPointer
  10592.         );
  10593.  
  10594.     KSDDKAPI
  10595.     NTSTATUS
  10596.     NTAPI
  10597.     KsStreamPointerAdvanceOffsets(
  10598.         IN PKSSTREAM_POINTER StreamPointer,
  10599.         IN ULONG InUsed,
  10600.         IN ULONG OutUsed,
  10601.         IN BOOLEAN Eject
  10602.         );
  10603.  
  10604.     KSDDKAPI
  10605.     NTSTATUS
  10606.     NTAPI
  10607.     KsStreamPointerAdvance(
  10608.         IN PKSSTREAM_POINTER StreamPointer
  10609.         );
  10610.  
  10611.     KSDDKAPI
  10612.     PMDL
  10613.     NTAPI
  10614.     KsStreamPointerGetMdl(
  10615.         IN PKSSTREAM_POINTER StreamPointer
  10616.         );
  10617.  
  10618.     KSDDKAPI
  10619.     PIRP
  10620.     NTAPI
  10621.     KsStreamPointerGetIrp(
  10622.         IN PKSSTREAM_POINTER StreamPointer,
  10623.         OUT PBOOLEAN FirstFrameInIrp OPTIONAL,
  10624.         OUT PBOOLEAN LastFrameInIrp OPTIONAL
  10625.         );
  10626.  
  10627.     KSDDKAPI
  10628.     void
  10629.     NTAPI
  10630.     KsStreamPointerScheduleTimeout(
  10631.         IN PKSSTREAM_POINTER StreamPointer,
  10632.         IN PFNKSSTREAMPOINTER Callback,
  10633.         IN ULONGLONG Interval
  10634.         );
  10635.  
  10636.     KSDDKAPI
  10637.     void
  10638.     NTAPI
  10639.     KsStreamPointerCancelTimeout(
  10640.         IN PKSSTREAM_POINTER StreamPointer
  10641.         );
  10642.  
  10643.     KSDDKAPI
  10644.     PKSSTREAM_POINTER
  10645.     NTAPI
  10646.     KsPinGetFirstCloneStreamPointer(
  10647.         IN PKSPIN Pin
  10648.         );
  10649.  
  10650.     KSDDKAPI
  10651.     PKSSTREAM_POINTER
  10652.     NTAPI
  10653.     KsStreamPointerGetNextClone(
  10654.         IN PKSSTREAM_POINTER StreamPointer
  10655.         );
  10656.  
  10657.     KSDDKAPI
  10658.     NTSTATUS
  10659.     NTAPI
  10660.     KsPinHandshake(
  10661.         IN PKSPIN Pin,
  10662.         IN PKSHANDSHAKE In,
  10663.         OUT PKSHANDSHAKE Out
  10664.         );
  10665.  
  10666.     KSDDKAPI
  10667.     void
  10668.     NTAPI
  10669.     KsCompletePendingRequest(
  10670.         IN PIRP Irp
  10671.         );
  10672.  
  10673.     KSDDKAPI
  10674.     KSOBJECTTYPE
  10675.     NTAPI
  10676.     KsGetObjectTypeFromIrp(
  10677.         IN PIRP Irp
  10678.         );
  10679.  
  10680.     KSDDKAPI
  10681.     PVOID
  10682.     NTAPI
  10683.     KsGetObjectFromFileObject(
  10684.         IN PFILE_OBJECT FileObject
  10685.         );
  10686.  
  10687.     KSDDKAPI
  10688.     KSOBJECTTYPE
  10689.     NTAPI
  10690.     KsGetObjectTypeFromFileObject(
  10691.         IN PFILE_OBJECT FileObject
  10692.         );
  10693.  
  10694.     PKSFILTER __inline
  10695.     KsGetFilterFromFileObject(
  10696.         IN PFILE_OBJECT FileObject
  10697.         )
  10698.     {
  10699.         return (PKSFILTER) KsGetObjectFromFileObject(FileObject);
  10700.     }
  10701.  
  10702.     PKSPIN __inline
  10703.     KsGetPinFromFileObject(
  10704.         IN PFILE_OBJECT FileObject
  10705.         )
  10706.     {
  10707.         return (PKSPIN) KsGetObjectFromFileObject(FileObject);
  10708.     }    
  10709.  
  10710.     KSDDKAPI
  10711.     PKSGATE
  10712.     NTAPI
  10713.     KsFilterGetAndGate(
  10714.         IN PKSFILTER Filter
  10715.         );
  10716.  
  10717.     KSDDKAPI
  10718.     void
  10719.     NTAPI
  10720.     KsFilterAcquireProcessingMutex(
  10721.         IN PKSFILTER Filter
  10722.         );
  10723.  
  10724.     KSDDKAPI
  10725.     void
  10726.     NTAPI
  10727.     KsFilterReleaseProcessingMutex(
  10728.         IN PKSFILTER Filter
  10729.         );
  10730.  
  10731.     KSDDKAPI
  10732.     void
  10733.     NTAPI
  10734.     KsFilterAttemptProcessing(
  10735.         IN PKSFILTER Filter,
  10736.         IN BOOLEAN Asynchronous
  10737.         );
  10738.  
  10739.     KSDDKAPI
  10740.     PKSGATE
  10741.     NTAPI
  10742.     KsPinGetAndGate(
  10743.         IN PKSPIN Pin
  10744.         );
  10745.  
  10746.     KSDDKAPI
  10747.     void
  10748.     NTAPI
  10749.     KsPinAttachAndGate(
  10750.         IN PKSPIN Pin,
  10751.         IN PKSGATE AndGate OPTIONAL
  10752.         );
  10753.  
  10754.     KSDDKAPI
  10755.     void
  10756.     NTAPI
  10757.     KsPinAttachOrGate(
  10758.         IN PKSPIN Pin,
  10759.         IN PKSGATE OrGate OPTIONAL
  10760.         );
  10761.  
  10762.     KSDDKAPI
  10763.     void
  10764.     NTAPI
  10765.     KsPinAcquireProcessingMutex(
  10766.         IN PKSPIN Pin
  10767.         );
  10768.  
  10769.     KSDDKAPI
  10770.     void
  10771.     NTAPI
  10772.     KsPinReleaseProcessingMutex(
  10773.         IN PKSPIN Pin
  10774.         );
  10775.  
  10776.     KSDDKAPI
  10777.     BOOLEAN
  10778.     NTAPI
  10779.     KsProcessPinUpdate(
  10780.         IN PKSPROCESSPIN ProcessPin
  10781.         );
  10782.  
  10783.     KSDDKAPI
  10784.     void
  10785.     NTAPI
  10786.     KsPinAttemptProcessing(
  10787.         IN PKSPIN Pin,
  10788.         IN BOOLEAN Asynchronous
  10789.         );
  10790.  
  10791.     KSDDKAPI
  10792.     PVOID
  10793.     NTAPI
  10794.     KsGetParent(
  10795.         IN PVOID Object
  10796.         );
  10797.  
  10798.     PKSDEVICE __inline
  10799.     KsFilterFactoryGetParentDevice(
  10800.         IN PKSFILTERFACTORY FilterFactory
  10801.         )
  10802.     {
  10803.         return (PKSDEVICE) KsGetParent((PVOID) FilterFactory);
  10804.     }
  10805.  
  10806.     PKSFILTERFACTORY __inline
  10807.     KsFilterGetParentFilterFactory(
  10808.         IN PKSFILTER Filter
  10809.         )
  10810.     {
  10811.         return (PKSFILTERFACTORY) KsGetParent((PVOID) Filter);
  10812.     }
  10813.  
  10814.     KSDDKAPI
  10815.     PKSFILTER 
  10816.     NTAPI
  10817.     KsPinGetParentFilter(
  10818.         IN PKSPIN Pin
  10819.         );
  10820.  
  10821.     KSDDKAPI
  10822.     PVOID
  10823.     NTAPI
  10824.     KsGetFirstChild(
  10825.         IN PVOID Object
  10826.         );
  10827.  
  10828.     PKSFILTERFACTORY __inline
  10829.     KsDeviceGetFirstChildFilterFactory(
  10830.         IN PKSDEVICE Device
  10831.         )
  10832.     {
  10833.         return (PKSFILTERFACTORY) KsGetFirstChild((PVOID) Device);
  10834.     }
  10835.  
  10836.     PKSFILTER __inline
  10837.     KsFilterFactoryGetFirstChildFilter(
  10838.         IN PKSFILTERFACTORY FilterFactory
  10839.         )
  10840.     {
  10841.         return (PKSFILTER) KsGetFirstChild((PVOID) FilterFactory);
  10842.     }
  10843.  
  10844.     KSDDKAPI
  10845.     ULONG
  10846.     NTAPI
  10847.     KsFilterGetChildPinCount(
  10848.         IN PKSFILTER Filter,
  10849.         IN ULONG PinId
  10850.         );
  10851.  
  10852.     KSDDKAPI
  10853.     PKSPIN
  10854.     NTAPI
  10855.     KsFilterGetFirstChildPin(
  10856.         IN PKSFILTER Filter,
  10857.         IN ULONG PinId
  10858.         );
  10859.  
  10860.     KSDDKAPI
  10861.     PVOID
  10862.     NTAPI
  10863.     KsGetNextSibling(
  10864.         IN PVOID Object
  10865.         );
  10866.  
  10867.     KSDDKAPI
  10868.     PKSPIN 
  10869.     NTAPI
  10870.     KsPinGetNextSiblingPin(
  10871.         IN PKSPIN Pin
  10872.         );
  10873.  
  10874.     PKSFILTERFACTORY __inline
  10875.     KsFilterFactoryGetNextSiblingFilterFactory(
  10876.         IN PKSFILTERFACTORY FilterFactory
  10877.         )
  10878.     {
  10879.         return (PKSFILTERFACTORY) KsGetNextSibling((PVOID) FilterFactory);
  10880.     }
  10881.  
  10882.     PKSFILTER __inline
  10883.     KsFilterGetNextSiblingFilter(
  10884.         IN PKSFILTER Filter
  10885.         )
  10886.     {
  10887.         return (PKSFILTER) KsGetNextSibling((PVOID) Filter);
  10888.     }
  10889.  
  10890.  
  10891.     KSDDKAPI
  10892.     PKSDEVICE
  10893.     NTAPI
  10894.     KsGetDevice(
  10895.         IN PVOID Object
  10896.         );
  10897.  
  10898.     PKSDEVICE __inline
  10899.     KsFilterFactoryGetDevice(
  10900.         IN PKSFILTERFACTORY FilterFactory
  10901.         )
  10902.     {
  10903.         return KsGetDevice((PVOID) FilterFactory);
  10904.     }
  10905.  
  10906.     PKSDEVICE __inline
  10907.     KsFilterGetDevice(
  10908.         IN PKSFILTER Filter
  10909.         )
  10910.     {
  10911.         return KsGetDevice((PVOID) Filter);
  10912.     }
  10913.  
  10914.     PKSDEVICE __inline
  10915.     KsPinGetDevice(
  10916.         IN PKSPIN Pin
  10917.         )
  10918.     {
  10919.         return KsGetDevice((PVOID) Pin);
  10920.     }
  10921.  
  10922.     KSDDKAPI
  10923.     PKSFILTER
  10924.     NTAPI
  10925.     KsGetFilterFromIrp(
  10926.         IN PIRP Irp
  10927.         );
  10928.  
  10929.     KSDDKAPI
  10930.     PKSPIN
  10931.     NTAPI
  10932.     KsGetPinFromIrp(
  10933.         IN PIRP Irp
  10934.         );
  10935.  
  10936.     KSDDKAPI
  10937.     ULONG
  10938.     NTAPI
  10939.     KsGetNodeIdFromIrp(
  10940.         IN PIRP Irp
  10941.         );
  10942.  
  10943.     KSDDKAPI
  10944.     void
  10945.     NTAPI
  10946.     KsAcquireControl(
  10947.         IN PVOID Object
  10948.         );
  10949.  
  10950.     KSDDKAPI
  10951.     void
  10952.     NTAPI
  10953.     KsReleaseControl(
  10954.         IN PVOID Object
  10955.         );
  10956.  
  10957.     void __inline
  10958.     KsFilterAcquireControl(
  10959.         IN PKSFILTER Filter
  10960.         )
  10961.     {
  10962.         KsAcquireControl((PVOID) Filter);
  10963.     }
  10964.  
  10965.     void __inline
  10966.     KsFilterReleaseControl(
  10967.         IN PKSFILTER Filter
  10968.         )
  10969.     {
  10970.         KsReleaseControl((PVOID) Filter);
  10971.     }
  10972.  
  10973.     void __inline
  10974.     KsPinAcquireControl(
  10975.         IN PKSPIN Pin
  10976.         )
  10977.     {
  10978.         KsAcquireControl((PVOID) Pin);
  10979.     }
  10980.  
  10981.     void __inline
  10982.     KsPinReleaseControl(
  10983.         IN PKSPIN Pin
  10984.         )
  10985.     {
  10986.         KsReleaseControl((PVOID) Pin);
  10987.     }
  10988.  
  10989.     KSDDKAPI
  10990.     NTSTATUS
  10991.     NTAPI
  10992.     KsAddItemToObjectBag(
  10993.         IN KSOBJECT_BAG ObjectBag,
  10994.         IN PVOID Item,
  10995.         IN PFNKSFREE Free OPTIONAL
  10996.         );
  10997.  
  10998.     KSDDKAPI
  10999.     ULONG
  11000.     NTAPI
  11001.     KsRemoveItemFromObjectBag(
  11002.         IN KSOBJECT_BAG ObjectBag,
  11003.         IN PVOID Item,
  11004.         IN BOOLEAN Free
  11005.         );
  11006.  
  11007.     #define KsDiscard(Object,Pointer)\
  11008.         KsRemoveItemFromObjectBag(\
  11009.             (Object)->Bag,\
  11010.             (PVOID)(Pointer),\
  11011.             TRUE)
  11012.  
  11013.     KSDDKAPI
  11014.     NTSTATUS
  11015.     NTAPI
  11016.     KsAllocateObjectBag(
  11017.         IN PKSDEVICE Device,
  11018.         OUT KSOBJECT_BAG* ObjectBag
  11019.         );
  11020.  
  11021.     KSDDKAPI
  11022.     void
  11023.     NTAPI
  11024.     KsFreeObjectBag(
  11025.         IN KSOBJECT_BAG ObjectBag
  11026.         );
  11027.  
  11028.     KSDDKAPI
  11029.     NTSTATUS
  11030.     NTAPI
  11031.     KsCopyObjectBagItems(
  11032.         IN KSOBJECT_BAG ObjectBagDestination,
  11033.         IN KSOBJECT_BAG ObjectBagSource
  11034.         );
  11035.  
  11036.     KSDDKAPI
  11037.     NTSTATUS
  11038.     NTAPI
  11039.     _KsEdit(
  11040.         IN KSOBJECT_BAG ObjectBag,
  11041.         IN OUT PVOID* PointerToPointerToItem,
  11042.         IN ULONG NewSize,
  11043.         IN ULONG OldSize,
  11044.         IN ULONG Tag
  11045.         );
  11046.  
  11047.     #define KsEdit(Object,PointerToPointer,Tag)\
  11048.         _KsEdit(\
  11049.             (Object)->Bag,\
  11050.             (PVOID*)(PointerToPointer),\
  11051.             sizeof(**(PointerToPointer)),\
  11052.             sizeof(**(PointerToPointer)),\
  11053.             (Tag))
  11054.     #define KsEditSized(Object,PointerToPointer,NewSize,OldSize,Tag)\
  11055.         _KsEdit((Object)->Bag,(PVOID*)(PointerToPointer),(NewSize),(OldSize),(Tag))
  11056.  
  11057.     KSDDKAPI
  11058.     NTSTATUS
  11059.     NTAPI
  11060.     KsRegisterFilterWithNoKSPins(
  11061.                                           IN PDEVICE_OBJECT DeviceObject,
  11062.                                           IN const GUID * InterfaceClassGUID,
  11063.                                           IN ULONG PinCount,
  11064.                                           IN BOOL * PinDirection,
  11065.                                           IN KSPIN_MEDIUM * MediumList,
  11066.                                           IN OPTIONAL GUID * CategoryList
  11067.     );
  11068.  
  11069.     KSDDKAPI
  11070.     NTSTATUS
  11071.     NTAPI
  11072.     KsFilterCreatePinFactory (
  11073.         IN PKSFILTER Filter,
  11074.         IN const KSPIN_DESCRIPTOR_EX *const PinDescriptor,
  11075.         OUT PULONG PinID
  11076.         );
  11077.  
  11078.     KSDDKAPI
  11079.     NTSTATUS
  11080.     NTAPI
  11081.     KsFilterCreateNode (
  11082.         IN PKSFILTER Filter,
  11083.         IN const KSNODE_DESCRIPTOR *const NodeDescriptor,
  11084.         OUT PULONG NodeID
  11085.         );
  11086.  
  11087.     KSDDKAPI
  11088.     NTSTATUS
  11089.     NTAPI
  11090.     KsFilterAddTopologyConnections (
  11091.         IN PKSFILTER Filter,
  11092.         IN ULONG NewConnectionsCount,
  11093.         IN const KSTOPOLOGY_CONNECTION *const NewTopologyConnections
  11094.         );
  11095.  
  11096.     KSDDKAPI
  11097.     NTSTATUS
  11098.     NTAPI
  11099.     KsPinGetConnectedPinInterface(
  11100.         IN PKSPIN Pin,
  11101.         IN const GUID* InterfaceId,
  11102.         OUT PVOID* Interface
  11103.         );
  11104.  
  11105.     KSDDKAPI
  11106.     PFILE_OBJECT
  11107.     NTAPI
  11108.     KsPinGetConnectedPinFileObject(
  11109.         IN PKSPIN Pin
  11110.         );
  11111.  
  11112.     KSDDKAPI
  11113.     NTSTATUS
  11114.     NTAPI
  11115.     KsPinGetConnectedFilterInterface(
  11116.         IN PKSPIN Pin,
  11117.         IN const GUID* InterfaceId,
  11118.         OUT PVOID* Interface
  11119.         );
  11120.  
  11121.     #if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
  11122.  
  11123.     KSDDKAPI
  11124.     NTSTATUS
  11125.     NTAPI
  11126.     KsPinGetReferenceClockInterface(
  11127.         IN PKSPIN Pin,
  11128.         OUT PIKSREFERENCECLOCK* Interface
  11129.         );
  11130.  
  11131.     #endif //defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
  11132.  
  11133.     KSDDKAPI
  11134.     VOID
  11135.     NTAPI
  11136.     KsPinSetPinClockTime(
  11137.         IN PKSPIN Pin,
  11138.         IN LONGLONG Time
  11139.         );
  11140.  
  11141.     KSDDKAPI
  11142.     NTSTATUS
  11143.     NTAPI
  11144.     KsPinSubmitFrame(
  11145.         IN PKSPIN Pin,
  11146.         IN PVOID Data OPTIONAL,
  11147.         IN ULONG Size OPTIONAL,
  11148.         IN PKSSTREAM_HEADER StreamHeader OPTIONAL,
  11149.         IN PVOID Context OPTIONAL
  11150.         );
  11151.  
  11152.     KSDDKAPI
  11153.     NTSTATUS
  11154.     NTAPI
  11155.     KsPinSubmitFrameMdl(
  11156.         IN PKSPIN Pin,
  11157.         IN PMDL Mdl OPTIONAL,
  11158.         IN PKSSTREAM_HEADER StreamHeader OPTIONAL,
  11159.         IN PVOID Context OPTIONAL
  11160.         );
  11161.  
  11162.     KSDDKAPI
  11163.     void
  11164.     NTAPI
  11165.     KsPinRegisterFrameReturnCallback(
  11166.         IN PKSPIN Pin,
  11167.         IN PFNKSPINFRAMERETURN FrameReturn
  11168.         );
  11169.  
  11170.     KSDDKAPI
  11171.     void
  11172.     NTAPI
  11173.     KsPinRegisterHandshakeCallback(
  11174.         IN PKSPIN Pin,
  11175.         IN PFNKSPINHANDSHAKE Handshake
  11176.         );
  11177.  
  11178.     KSDDKAPI
  11179.     void
  11180.     NTAPI
  11181.     KsFilterRegisterPowerCallbacks(
  11182.         IN PKSFILTER Filter,
  11183.         IN PFNKSFILTERPOWER Sleep OPTIONAL,
  11184.         IN PFNKSFILTERPOWER Wake OPTIONAL
  11185.         );
  11186.  
  11187.     KSDDKAPI
  11188.     void
  11189.     NTAPI
  11190.     KsPinRegisterPowerCallbacks(
  11191.         IN PKSPIN Pin,
  11192.         IN PFNKSPINPOWER Sleep OPTIONAL,
  11193.         IN PFNKSPINPOWER Wake OPTIONAL
  11194.         );
  11195.  
  11196.     #if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
  11197.  
  11198.     KSDDKAPI
  11199.     PUNKNOWN
  11200.     NTAPI
  11201.     KsRegisterAggregatedClientUnknown(
  11202.         IN PVOID Object,
  11203.         IN PUNKNOWN ClientUnknown 
  11204.         );
  11205.  
  11206.     KSDDKAPI
  11207.     PUNKNOWN
  11208.     NTAPI
  11209.     KsGetOuterUnknown(
  11210.         IN PVOID Object
  11211.         );
  11212.  
  11213.     PUNKNOWN __inline
  11214.     KsDeviceRegisterAggregatedClientUnknown(
  11215.         IN PKSDEVICE Device,
  11216.         IN PUNKNOWN ClientUnknown 
  11217.         )
  11218.     {
  11219.         return KsRegisterAggregatedClientUnknown((PVOID) Device,ClientUnknown);
  11220.     }
  11221.  
  11222.     PUNKNOWN __inline
  11223.     KsDeviceGetOuterUnknown(
  11224.         IN PKSDEVICE Device
  11225.         )
  11226.     {
  11227.         return KsGetOuterUnknown((PVOID) Device);
  11228.     }
  11229.  
  11230.     PUNKNOWN __inline
  11231.     KsFilterFactoryRegisterAggregatedClientUnknown(
  11232.         IN PKSFILTERFACTORY FilterFactory,
  11233.         IN PUNKNOWN ClientUnknown 
  11234.         )
  11235.     {
  11236.         return KsRegisterAggregatedClientUnknown((PVOID) FilterFactory,ClientUnknown);
  11237.     }
  11238.  
  11239.     PUNKNOWN __inline
  11240.     KsFilterFactoryGetOuterUnknown(
  11241.         IN PKSFILTERFACTORY FilterFactory
  11242.         )
  11243.     {
  11244.         return KsGetOuterUnknown((PVOID) FilterFactory);
  11245.     }
  11246.  
  11247.     PUNKNOWN __inline
  11248.     KsFilterRegisterAggregatedClientUnknown(
  11249.         IN PKSFILTER Filter,
  11250.         IN PUNKNOWN ClientUnknown 
  11251.         )
  11252.     {
  11253.         return KsRegisterAggregatedClientUnknown((PVOID) Filter,ClientUnknown);
  11254.     }
  11255.  
  11256.     PUNKNOWN __inline
  11257.     KsFilterGetOuterUnknown(
  11258.         IN PKSFILTER Filter
  11259.         )
  11260.     {
  11261.         return KsGetOuterUnknown((PVOID) Filter);
  11262.     }
  11263.  
  11264.     PUNKNOWN __inline
  11265.     KsPinRegisterAggregatedClientUnknown(
  11266.         IN PKSPIN Pin,
  11267.         IN PUNKNOWN ClientUnknown 
  11268.         )
  11269.     {
  11270.         return KsRegisterAggregatedClientUnknown((PVOID) Pin,ClientUnknown);
  11271.     }
  11272.  
  11273.     PUNKNOWN __inline
  11274.     KsPinGetOuterUnknown(
  11275.         IN PKSPIN Pin
  11276.         )
  11277.     {
  11278.         return KsGetOuterUnknown((PVOID) Pin);
  11279.     }
  11280.  
  11281.     #endif // defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
  11282.  
  11283.     #else // !defined(_NTDDK_)
  11284.  
  11285.     #if !defined( KS_NO_CREATE_FUNCTIONS )
  11286.  
  11287.     KSDDKAPI
  11288.     DWORD
  11289.     WINAPI
  11290.     KsCreateAllocator(
  11291.         IN HANDLE ConnectionHandle,
  11292.         IN PKSALLOCATOR_FRAMING AllocatorFraming,
  11293.         OUT PHANDLE AllocatorHandle
  11294.         );
  11295.  
  11296.     KSDDKAPI
  11297.     DWORD
  11298.     NTAPI
  11299.     KsCreateClock(
  11300.         IN HANDLE ConnectionHandle,
  11301.         IN PKSCLOCK_CREATE ClockCreate,
  11302.         OUT PHANDLE ClockHandle
  11303.         );
  11304.  
  11305.     KSDDKAPI
  11306.     DWORD
  11307.     WINAPI
  11308.     KsCreatePin(
  11309.         IN HANDLE FilterHandle,
  11310.         IN PKSPIN_CONNECT Connect,
  11311.         IN ACCESS_MASK DesiredAccess,
  11312.         OUT PHANDLE ConnectionHandle
  11313.         );
  11314.  
  11315.     KSDDKAPI
  11316.     DWORD
  11317.     WINAPI
  11318.     KsCreateTopologyNode(
  11319.         IN HANDLE ParentHandle,
  11320.         IN PKSNODE_CREATE NodeCreate,
  11321.         IN ACCESS_MASK DesiredAccess,
  11322.         OUT PHANDLE NodeHandle
  11323.         );
  11324.     
  11325.     #endif
  11326.  
  11327.     #endif // !defined(_NTDDK_)
  11328.  
  11329.     #if defined(__cplusplus)
  11330.     }
  11331.     #endif // defined(__cplusplus)
  11332.  
  11333.  
  11334. #endif    // DirectX 8.0 content
  11335.  
  11336.  
  11337. #endif // !_KS_
  11338.